Clipper On Line • Ver Tópico - Transformar em SQl
Página 1 de 2

Transformar em SQl

MensagemEnviado: 04 Jan 2018 08: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

MensagemEnviado: 06 Jan 2018 12: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:
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:
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

MensagemEnviado: 10 Jan 2018 07:52
por andrelucass
Gostaria de agradecer pela resposta, vou testar

Transformar em SQl

MensagemEnviado: 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

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

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 28 Jan 2020 17:35
por asimoes
Traduzindo isso:

do while pedidos->data >= dDataI .and. pedidos->data <= dDataF .and. pedidos->(!eof())

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
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

MensagemEnviado: 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

MensagemEnviado: 28 Jan 2020 20:42
por asimoes
Ops, correção da minha postagem: é P.Data

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

MensagemEnviado: 28 Jan 2020 20:48
por asimoes
Outra forma é usando bind ?, nesse caso não precisa converter para string a data

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

MensagemEnviado: 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

MensagemEnviado: 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

MensagemEnviado: 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

            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

MensagemEnviado: 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:
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

MensagemEnviado: 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.

Transformar em SQl

MensagemEnviado: 02 Abr 2020 09:34
por asimoes
Pode estar errado mas é uma ideia:
SELECT
   S.CODIGO, SUM( S.SALDO ) AS SALDO
FROM
   SALDOCONTABIL S
   INNER JOIN PLANOCONTABIL P ON P.CODIGO = S.CODIGO
WHERE
   S.DATA BETWEEN dDataI AND dDataF AND
   S.CODIGO = XNumAux
GROUP BY
   S.CODIGO