Clipper On Line • Ver Tópico - Transformar em SQl

Transformar em SQl

Discussão sobre SQL

Moderador: Moderadores

 

Transformar em SQl

Mensagempor andrelucass » 04 Jan 2018 08:16

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
andrelucass
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 112
Data de registro: 25 Fev 2005 10:40
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Transformar em SQl

Mensagempor sygecom » 06 Jan 2018 12:56

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.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
leonardodemachado@hotmail.com

Faça você também sua doação esse fórum é uma lenda viva: http://www.pctoledo.com.br/doacao
Avatar de usuário

sygecom
Usuário Nível 7

Usuário Nível 7
 
Mensagens: 6727
Data de registro: 21 Jul 2006 10:12
Cidade/Estado: Alvorada-RS
Curtiu: 1 vez
Mens.Curtidas: 81 vezes

Transformar em SQl

Mensagempor andrelucass » 10 Jan 2018 07:52

Gostaria de agradecer pela resposta, vou testar
andrelucass
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 112
Data de registro: 25 Fev 2005 10:40
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Transformar em SQl

Mensagempor andrelucass » 28 Jan 2020 10:25

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
Nota de Moderação:
JoséQuintas: Mensagem editada para colocar a tag [ code ]
Veja como utilizar esta tag: Clique aqui
andrelucass
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 112
Data de registro: 25 Fev 2005 10:40
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Transformar em SQl

Mensagempor JoséQuintas » 28 Jan 2020 16:55

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.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 13783
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Transformar em SQl

Mensagempor JoséQuintas » 28 Jan 2020 17:02

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.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 13783
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Transformar em SQl

Mensagempor asimoes » 28 Jan 2020 17:35

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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4593
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 312 vezes
Mens.Curtidas: 222 vezes

Transformar em SQl

Mensagempor JoséQuintas » 28 Jan 2020 18:15

É 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...
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 13783
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Transformar em SQl

Mensagempor asimoes » 28 Jan 2020 20:42

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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4593
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 312 vezes
Mens.Curtidas: 222 vezes

Transformar em SQl

Mensagempor asimoes » 28 Jan 2020 20:48

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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4593
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 312 vezes
Mens.Curtidas: 222 vezes

Transformar em SQl

Mensagempor JoséQuintas » 28 Jan 2020 21:51

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.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 13783
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Transformar em SQl

Mensagempor asimoes » 28 Jan 2020 21:56

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
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar de usuário

asimoes
Colaborador

Colaborador
 
Mensagens: 4593
Data de registro: 26 Abr 2007 16:48
Cidade/Estado: RIO DE JANEIRO-RJ
Curtiu: 312 vezes
Mens.Curtidas: 222 vezes

Transformar em SQl

Mensagempor andrelucass » 01 Abr 2020 13:58

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
andrelucass
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 112
Data de registro: 25 Fev 2005 10:40
Curtiu: 0 vez
Mens.Curtidas: 5 vezes

Transformar em SQl

Mensagempor alxsts » 02 Abr 2020 00:47

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
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2291
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 14 vezes
Mens.Curtidas: 159 vezes

Transformar em SQl

Mensagempor JoséQuintas » 02 Abr 2020 09:18

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.
José M. C. Quintas
Harbour 3.4, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, hbnetio, PNotepad
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
Avatar de usuário

JoséQuintas
Colaborador

Colaborador
 
Mensagens: 13783
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 848 vezes

Próximo



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 1 visitante


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro