Página 1 de 2
Transformar em SQl
Enviado: 04 Jan 2018 09:16
por andrelucass
Ola a todos
Estou migrando minha base de dados de DBF para postgresql, sou iniciante em sql, e gostaria de saber como transforma essa rotina de para sql.
while MovFun->(!eof())
if CadFun->(dbsetorder(1),dbseek(MovFun->CodFun))
while !CadFun->(Trava_Reg())
end
if MovFun->tipo == "1"
CadFun->SldFun += MovFun->Valor
else
CadFun->SldFun -= MovFun->Valor
end
CadFun->(dbunlock())
end
MovFun->(dbskip())
Atenciosamente
André Lucas Souza
Transformar em SQl
Enviado: 06 Jan 2018 13:56
por sygecom
André,
Até virar a chave, pode ser que você fique confuso, mas lhe garanto que em pouco tempo, vai começar a dominar a coisa, o SQL é fácil depois que pega o jeito, tudo fica mais fácil e transparente.
Existe varias formas de fazer isso.
Vou postar uns exemplos:
Código: Selecionar todos
update cadfun as a set sldfun=a.sldfun+ a.valor+coalesce((select sum(valor) from movfun as b where b.codfun=a.CODFUN and b.movfun='1'),0) - coalesce((select sum(valor) from movfun as b where b.codfun=a.CODFUN and b.movfun<>'1'),0)
Nesse exemplo acima, estou pegando todos os cadastro de funcionários e, pegando o valor anterior do campo de saldo, somando todos os valores igual a tipo um, menos todos os valores diferente de tipo um, e deduzindo que na tabela MOVFUN o campo com o código do funcionário seja CODFUN, caso não seja mude aonde está: a.CODFUN para o nome de campo certo.
Outro exemplo:
Código: Selecionar todos
aSQL:=EXECUTA_SQL('select codfun,valor,tipo from movfun') // pega todas as movimentações, o certo era ter um WHERE pra limitar as buscas
FOR nI:=1 TO len(aSQL)
IF aSQL[nI,3]=='1'
EXECUTA_SQL('update cadfun set sldfun=sldfun+'+cs(aSQL[nI,2])+' where codfun='+cs(aSQL[nI,1]) )
ELSE
EXECUTA_SQL('update cadfun set sldfun=sldfun-'+cs(aSQL[nI,2])+' where codfun='+cs(aSQL[nI,1]) )
ENDIF
NEXT
Nesse exemplo acima, estou deduzindo que você tenha alguma FUNCTION que retorne em ARRAY seus comando SQL e, uma FUNCTION que retorne em string como deve ser concatenado suas variáveis no sql ( meu exemplo tenho a FUNCTION CS() )
Pode ser que eu tenha me esquecido de algo, fiz aqui direto no forum o exemplo, e claro que isso tudo você precisa entender e testar. Qualquer duvida, post aqui.
Transformar em SQl
Enviado: 10 Jan 2018 08:52
por andrelucass
Gostaria de agradecer pela resposta, vou testar
Transformar em SQl
Enviado: 28 Jan 2020 10:25
por andrelucass
Bom dia todos
Estou migrando de dbf para postgresql como transforma de dbf para postgresql exemplo
relatorio de produtos de um pedido por periodo
Código: Selecionar todos
local dDataI := ctod("01/01/2019")
local dDataF := ctod("31/12/2019")
use pedidos
index on data to pedidos
use itemped
index on numero to itemped
dbcloseall()
use pedidos alias pedidos new
set index to pedidos
use itemped alias itemped new
set index to itemped
Pedidos->(dbseek(dDatai))
do while pedidos->data >= dDataI .and. pedidos->data <= dDataF .and. pedidos->(!eof())
@ prow()+1,00 say pedidos->numero
@ prow() ,10 say pedidos->data
itemped->(dbsetorder(1),dbseek(pedidos->numero))
do while itemped->numero = pedidos->numero .and. itemped->(!eof())
@ prow()+1,00 say itemped->codprod
itemped->(dbskip())
enddo
pedidos->(dbskip())
enddo
a duvida é como pegar essas informações.
Atenciosamente
André Lucas Soua
Transformar em SQl
Enviado: 28 Jan 2020 16:55
por JoséQuintas
Como tá sem resposta, colocar como seria no MySQL.
Procure dividir em partes, pode ser que ajude a memorizar.
Primeiro pedidos:
SELECT campos
FROM PEDIDOS
WHERE data between '2020-01-01' and '2020-01-31'
ao adicionar itens, com certeza vai precisar mexer na lista de campos, do SELECT, e indicar de onde vém, do FROM.
relacionamento (JOIN) faz parte do FROM
SELECT data, numero, itemped.codprod as produto
FROM PEDIDOS
INNER JOIN itemped ON pedidos.numero = itemped.numero
WHERE data between '2020-01-01' and '2020-01-31'
há outras formas de escrever isso, inclusive no próprio MySQL.
Agora é confirmar se precisa ajuste para o PostgresSQL
Lembrando: se itemped tiver índice por numero será muito mais rápido.
Transformar em SQl
Enviado: 28 Jan 2020 17:02
por JoséQuintas
Faltou definir a ordem, pra não ficar espalhado de qualquer jeito.
o ORDER BY, pra ordem, tem a ver com o resultado do SELECT
select DATA, NUMERO, itemped.codprod as PRODUTO
...
ORDER BY DATA, NUMERO, PRODUTO
Precisam ser nomes existentes no SELECT. Apenas por coincidência, o exemplo usou todos os campos e na mesma ordem.
Transformar em SQl
Enviado: 28 Jan 2020 17:35
por asimoes
Traduzindo isso:
do while pedidos->data >= dDataI .and. pedidos->data <= dDataF .and. pedidos->(!eof())
Código: Selecionar todos
cDataI := "'" + Hb_DtoC( dDataI, "YYYY-MM-DD") + "'"
cDataF := "'" + Hb_DtoC( dDataF, "YYYY-MM-DD") + "'"
cQuery := "SELECT * FROM PEDIDOS P "
cQuery += "WHERE "
cQuery += " P.Pedidos between " + cDataI + " and " + cDataF
O resultset pode alimentar uma hashtable ou um dbf temporário se quiser
Código: Selecionar todos
oRs:MoveFirst()
nCol := ( oRs:Fields:Count ) - 1
Do While ! oRs:Eof
FOR i:=0 TO nCol
xVaue := oRs:Fields( i ):value
NEXT
oRs:MoveNext()
Enddo
Transformar em SQl
Enviado: 28 Jan 2020 18:15
por JoséQuintas
É só comentário:
PEDIDO P
Dependendo da base de dados, esse ALIAS não é aceito abreviado.
E antigamente no MySQL tinha que ser obrigatoriamente assim.
Não lembro se no ADS é assim, ou completo.
PEDIDO AS P
Isso ajuda a deixar o comando menor, porque ao invés de ficar escrevendo pedido.isso, pedido.aquilo, é só escrever p.isso, p.aquilo.
Dá pra comparar com DBF:
use ( arquivo ) ALIAS um
? um->codigo
É só comentário.
Quero que todos aprendam SQL, porque quem é aluno hoje, vai virar professor amanhã.
E tem tanta opção disponível, que é impossível uma única pessoa aprender tudo que é opção que existe.
Então... com certeza vamos sempre estar trocando aprendizado.
Esse básico é importante, porque qualquer coisa mais complicada vai ter a parte básica dentro.
E também pra ajudar a entender os diversos exemplos da internet.
Sinceramente... tem exemplos que já vi que não entendi porr.. nenhuma... kkkk
Pelo menos por enquanto...
Transformar em SQl
Enviado: 28 Jan 2020 20:42
por asimoes
Ops, correção da minha postagem: é P.Data
Código: Selecionar todos
cDataI := "'" + Hb_DtoC( dDataI, "YYYY-MM-DD") + "'"
cDataF := "'" + Hb_DtoC( dDataF, "YYYY-MM-DD") + "'"
cQuery := "SELECT * FROM PEDIDOS P "
cQuery += "WHERE "
cQuery += " P.Data between " + cDataI + " and " + cDataF
Transformar em SQl
Enviado: 28 Jan 2020 20:48
por asimoes
Outra forma é usando bind ?, nesse caso não precisa converter para string a data
Código: Selecionar todos
cQuery := "SELECT * FROM PEDIDOS P "
cQuery += "WHERE "
cQuery += " P.Data between ? and ? "
WITH OBJECT oCommand
oPrm := :CreateParameter("DATAI", adDate, adParamInput, 8, dDataI)
:Parameters:Append( oPrm )
oPrm := :CreateParameter("DATAF", adDate, adParamInput, 8, dDataF)
:Parameters:Append( oPrm )
:CommandText := cQuery
:CommandType := adCmdText
oRs := :Execute()
END
Transformar em SQl
Enviado: 28 Jan 2020 21:51
por JoséQuintas
asimoes escreveu:Outra forma é usando bind ?, nesse caso não precisa converter para string a data
Interessante esse, e seria mais interessante se desse pra combinar comandos.
Algo do tipo
SELECT * FROM JPPEDIDOS WHERE STATUS IN ( ? )
E depois pudesse substituir por SELECT ....
Deixaria um comando mais legível.
Acho que só faltou dizer que isso é recurso do ADO, não deve ter em outros componentes.
E mostrar como cria o objeto de comando, senão muitos vão querer testar e não vão conseguir.
Transformar em SQl
Enviado: 28 Jan 2020 21:56
por asimoes
Até agora o uso de bind tem funcionado no Oracle (OleDb) onde usamos muito, testei com o ADS que funcionou e agora com o MariaDB também, tanto com driver OleDb e ODBC
É muito importante colocar exatamente na ordem que for usar o ? no oCommand:Parameters:Append( oPrm ), porque é uma sequência
Transformar em SQl
Enviado: 01 Abr 2020 13:58
por andrelucass
Ola a todos
Tenho esse trecho de codigo usando ainda .DBF como faço pra sql, ou iniciante em sql, uso o postgresql
Código: Selecionar todos
XNumAux := PlanoContabil->codigo //NumAux
Set Soft On
SaldoContabil->(dbsetorder(2),dbseek(str(xNumAux,5)+Dtos(dDataI)))
Set Soft Off
If SaldoContabil->(found())
Atenciosamente
André Lucas Souza
Transformar em SQl
Enviado: 02 Abr 2020 00:47
por alxsts
Olá!
Sem ver os layoutes das tabelas, fica difícil. Mas, segue um exemplo, que não sei se serve:
Código: Selecionar todos
select
*
from SaldoContabil s
inner join PlanoContabil p on p.codigo = s.codigo
where
s.data >= dataInicial
and s.data <= ddataFinal2 -- se quiser apenas maior que uma determinada data, retire esta linha
Transformar em SQl
Enviado: 02 Abr 2020 09:18
por JoséQuintas
Geralmente SQL é para um conjunto, e não para uma determinada condição.
Se não existe saldo na data, faz o que? considera saldo zero? pega o seguinte? afinal, SOFTSEEK faz isso e é o que está usando.
Apenas comentário do comando anterior: ele vai trazer TODOS os saldos no intervalo de datas, não apenas um.