quarta-feira, 26 de fevereiro de 2014

MySql, Select de tabela NOT EXISTS

Finalidade: Efetuar SELECT na tabela principal, de registros ainda não incluídos na tabela secundária.

SELECT os.numero,os.data_entrada,os.hora_entrada,os.data_prevista,os.hora_prevista
,cli.nomcli,cli.fancli
,os.responsavel,uso.fantasia,os.status,os.seq_entrega
FROM os_cadastro AS os, cli_cadastro AS cli,usuario_cadastro AS uso
WHERE os.status = '0'
AND os.seq_entrega<>'0000-00-00 00:00:00'
AND os.cli_codigo=cli.codcli
AND os.responsavel=uso.codigo
AND os.digital1440='1'
AND NOT EXISTS (SELECT NULL FROM os_detalhe_andamento WHERE os_detalhe_andamento.numero=os.numero)

sexta-feira, 13 de dezembro de 2013

Indices em MySql

Índices em MySql são necessários para a performance do banco.

Uma boa forma de verificar esta performance e qual índice o banco está utilizando, é colocar EXPLAIN antes da query a ser executada no seu manipulador de banco preferido.

Abaixe um pequeno exemplo de como criar/recriar índices:

PSQL_Index(xBanco,'tabela','idx_nome_indice',{'campo1','campo2'},Arg1)


**-----------------------------------------------------------------------------**
**  Finalidade: criar indices nativos no banco de dados
**  Parametros: Conexao       = Qual banco vai conectar
**              Tabela        = tabela que vai criar os indices
**              Indice        = Nome do indice que vai ser criado
**              Campos        = Campos no indice
**              DeletaIndices = .t. (apaga) ou .f. (nao apaga)
**-----------------------------------------------------------------------------**
    FUNCTION PSQL_Index(Conexao,Tabela,Indice,Campos,DeletaIndices)
    #include 'fivewin.ch'
**-----------------------------------------------------------------------------**
    **--[ verifica se vai deletar os indices existentes ]--**
    IF(DeletaIndices)
        SQL EXECUTE ("ALTER TABLE `"+Lower(tabela)+"` DROP INDEX `"+Lower(indice)+"`") INTO (conexao)
    ENDIF

    **--[ cria indices se nao existente ]--**
    IF(At(indice,ToString(SQLArray("SHOW INDEX FROM "+tabela,,Conexao)))==0)
        cCampo:=''
        FOR X = 1 TO Len(Campos)
            IF(Len(Campos)== X)
                cCampo+=Lower(Campos[X])
            ELSE
                cCampo+=Lower(Campos[X])+","
            ENDIF
        NEXT
        cCmd:="CREATE INDEX "+Lower(AllTrim(Indice))+" ON "+Lower(AllTrim(tabela))+" ("+AllTrim(cCampo)+")"
        PSQL_Execute(conexao,cCmd,Tabela)
    ENDIF
    RETURN(NIL)

sexta-feira, 22 de novembro de 2013

 
O cara deve ter morrido de tanto correr atrás

domingo, 28 de julho de 2013

xHarbour, Array excluindo e reposicionando registros

Adel(aArray,Item)
aSize(aArray,Len(aArray)-1)
aSort( aArray,,,{|x,y|x[1]<y[1]})
FOR X = 1 TO Len(aArray)
    aArray[x,1]:=X
NEXT

MySql, Select adcionado item (tipo recno do dbf)

SELECT @r:=@r+1 AS nreg,registro,codigo,descricao
FROM tabela,(SELECT @r:=0) x
WHERE status='0'

sexta-feira, 26 de julho de 2013

MySql - SELECT com IF(condição)

SELECT v.cfs_registro,c.emissao,c.tipo,c.dest_codigo,
IF(c.dest_codigo<999999,d.razao,'Consumidor') AS razao, quantidade,custo,valor,((valor/custo)*100)-100
FROM cfs_itens AS v,cfs_cabec AS c
LEFT JOIN cli_cadastro AS d ON d.registro=c.dest_codigo
WHERE v.codigo=327
AND v.cfs_registro=c.registro
AND c.emissao BETWEEN '2013-07-01' AND '2013-07-31'

quinta-feira, 25 de julho de 2013

MSQL cálculos diretos no SELECT

SELECT cli.razao,cli.mensal_juros
,cab.registro,cab.emissao,cab.nota_total
,(DATEDIFF(CURDATE(),cab.emissao)) AS atrazo_dias
,50.00 AS juros_taxa_mes
,CAST((cab.nota_total*50.00/100)/30 AS DECIMAL(12,2)) AS juros_dia
,CAST((cab.nota_total*50.00/100)/30 AS DECIMAL(12,2))*(DATEDIFF(CURDATE(),cab.emissao)) AS total_juros
,cab.nota_total+CAST((cab.nota_total*50.00/100)/30 AS DECIMAL(12,2))*(DATEDIFF(CURDATE(),cab.emissao)) AS total_pagar
FROM cfs_cabec AS cab, cli_cadastro AS cli
WHERE cab.dest_codigo='101'
AND cab.dest_codigo=cli.registro