Clipper On Line • Ver Tópico - Tutorial de SQL

Tutorial de SQL

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

 

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 12:07

O SQL é simples, tem os comandos e funções básicos, mas que podem ser combinados pra muita coisa mais complexa.

Incluir:

INSERT INTO clientes ( codigo, nome ) VALUES ( 10, 'JUCA' )

excluir:

DELETE FROM clientes WHERE codigo = 10
DELETE FROM clientes WHERE nome = 'JUCA'

atualizar:

UPDATE clientes SET nome = 'JOAO' where codigo = 10

muito cuidado na exclusão/atualização, porque diferente do DBF, se não indicar o que está querendo alterar, ele altera TUDO.

Este comando altera TODOS os clientes pra 'JOAO'

UPDATE clientes SET nome = 'JOAO'

E o principal, justamente a potência do SQL, buscar informações: SELECT

SELECT * FROM clientes
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 12:11

Um exemplo simples de combinação;

INSERT INTO fornecedores SELECT * FROM clientes

Vai incluir na tabela fornecedores, tudo que existe em clientes.
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 12:18

Acho que a parte mais difícil pra nós que estamos acostumados com Harbour/DBF, é sobre algumas funções pra banco de dados, e não pra fórmulas.

Um bom exemplo disso são MAX( VALOR ), MIN( VALOR )

Tudo bem, é pra retornar o maior ou menor valor, mas NÃO de uma fórmula matemática, mas do banco de dados.

Isso vai retornar o maior código de clientes existente na tabela.

SELECT MAX( CODIGO ) FROM clientes

Mas... e se eu quiser uma fórmula pra ter o maior ou menor valor entre dois números, não dá pra usar o MAX()?
Não.
Pra isso, tem o GREATEST() ou LEAST(), que são funções matemáticas pra maior ou menor.

Isso é uma coisa que demora pra se acostumar, ainda mais que no código fonte Harbour vamos continuar usando Max(), e vai ser sempre a primeira opção que vém na cabeça.

Mas de quebra, essas funções tem vantagem sobre as do Harbour: não se limita a apenas dois números
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 12:24

Convém destacar aqui, que nem todo SQL é exatamente igual.

Por exemplo, pra pegar os primeiros 10 registros de uma tabela:

SELECT * FROM tabela ORDER BY codigo LIMIT 10

Mas no SQL Server é diferente

SELECT TOP 10 * FROM tabela ORDER BY codigo

Mas tranquilo, muita coisa é padronizada, não se perde todo conhecimento de SQL ao trocar de banco de dados, apenas se ajustam algumas diferenças.
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 12:38

Agora sobre o SELECT

Isso vai longe, porque as possibilidades são infinitas.
O que pedir é o que o servidor vai retornar, não importa se vém de 1 tabela, 1000 tabelas, se os valores são cálculos encima das tabelas, etc. etc. etc.

O mais comum é pedir de uma tabela, com um filtro e em determinada ordem

SELECT codigo, nome FROM clientes WHERE codigo < 10 ORDER BY nome

Pra que perder tempo escolhendo nome de campo, se dá pra trazer tudo de uma vez?

Exatamente por esse motivo: pra que trazer tudo, se só precisa de duas informações de cada cliente?
Tempo de rede é importante, quanto menos informação melhor, porque usa menos rede.
É trazer exatamente o que precisa, e nada mais

Quer saber a quantidade de clientes... Não precisa nem trazer os clientes, basta perguntar pro servidor

SELECT COUNT(*) AS QTD FROM clientes

Numa consulta pelo HEIDISQL não precisa, mas pelo aplicativo, vai precisar de um nome para pegar a informação.
No comando acima, vém o campo QTD que vai conter o total de registros em clientes

Basicamente esse "AS QTD" é pra dizer que esse nome vai ser o nome desse "cálculo".
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 13:56

Total de vendas por mes
Se é por mês, precisamos dizer pro MySQL como ele obtém o mes, assim como ele retornar o mes

Há várias opções, algumas delas

SELECT DATE_FORMAT( DATA, '%Y-%m' ), SUM( VALOR )
FROM VENDAS
GROUP BY DATE_FORMAT( DATA, '%Y-%m' )

SELECT YEAR( DATA ), MONTH( DATA ), SUM( VALOR )
FROM VENDAS
GROUP BY YEAR( DATA ), MONTH( DATA )

SELECT CONCAT( LPAD( YEAR( DATA ), 4, '0' ), '-', LPAD( MONTH( DATA ), 2, '0' ) ), SUM( VALOR )
FROM VENDAS
GROUP BY CONCAT( LPAD( YEAR( DATA ), 4, '0' ), '-', LPAD( MONTH( DATA ), 2, '0' ) )

SELECT CONCAT_WS( '-', LPAD( YEAR( DATA ), 4, '0' ), LPAD( MONTH( DATA ), 2, '0' ) ), SUM( VALOR )
FROM VENDAS
GROUP BY CONCAT_WS( '-', LPAD( YEAR( DATA ), 4, '0' ), LPAD( MONTH( DATA ), 2, '0' ) )

De um jeito ou de outro, obtemos o resultado
Qual deles é melhor? sei lá... ainda não me preocupei com isso, mas o primeiro parece mais prático
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 14:41

Também dá pra selecionar do que foi selecionado, é chamado de sub-select

Primeiro um detalhe no comando anterior: faltou dar um nome para as "novas colunas"

SELECT 
DATE_FORMAT( DATA, '%Y-%m' ) AS MES,
SUM( VALOR ) AS SOMA
FROM VENDAS
GROUP BY DATE_FORMAT( DATA, '%Y-%m' )


Se esse vai ser um sub-select, também precisamos dar um nome a esse "temporario".
Ele vai acabar sendo usado assim

( SELECT 
DATE_FORMAT( DATA, '%Y-%m' ) AS MES,
SUM( VALOR ) AS SOMA
FROM VENDAS
GROUP BY DATE_FORMAT( DATA, '%Y-%m' )
)
AS PRIMEIROSELECT

Podemos fazer depois

SELECT MES, SOMA FROM ( Aqui_Entra_o_Comando_Acima ) AS PRIMEIROSELECT


Note que o select usa os nomes resultado do comando anterior.
NÃO pode usar nome repetido, existente na(s) tabela(s) usada(s) no comando, já que no caso de nome repetido o SQL não vai saber a qual deles se refere.
Muita atenção nisso. Tudo depende de como o comando é formado, há casos onde pode fazer isso, desde que esteja claro de onde vém a informação.
Com certeza, em cada resultado não pode ter nome repetido, mas podemos usar o AS pra trocar o nome.
SELECT MES, MES AS OUTROMES, SOMA, SOMA AS OUTRASOMA FROM ( Aqui_Entra_o_Comando_Acima ) AS PRIMEIROSELECT

o resultado vão ser os campos mes, outromes, soma, outrasoma

Que tal mostrar isso acima, um mês por coluna? 2020-07 2020-06 2020-05
E que tal um cliente por linha?

Tá, tudo bem, mas antes disso vamos a uma coisa importante:
Vamos mostrar só os meses 5, 6 e 7? Então não precisamos somar tudo, só os valores destes três meses.
E o melhor é alterar no que faz a soma, pra não ter tanta informação na memória do MySQL, antes de fazer o resto
SELECT 
CLIENTE, DATE_FORMAT( DATA, '%Y-%m' ) AS MES, SUM( VALOR ) AS SOMA
FROM VENDAS
WHERE DATA BETWEEN '2020-05-01' AND 2020-07-31'
GROUP BY CLIENTE, DATE_FORMAT( DATA, '%Y-%m' )

Pronto.
Agora vamos ao select encima desse select
SELECT
CLIENTE,
SUM( IF( MES = '2020-07', SOMA, 0 ) ) AS JULHO,
SUM( IF( MES = '2020-06', SOMA, 0 ) ) AS JUNHO,
SUM( IF( MES = '2020-05', SOMA, 0 ) ) AS MAIO
FROM ( O_SELECT_ACIMA ) AS PRIMEIROSELECT
GROUP BY CLIENTE

Nada extraordinário, usa o valor, se o valor pertencer à coluna
O detalhe a mais aqui, é que precisa agrupar por cliente, senão vai continuar saindo um mês em cada linha, por isso o group by

O comando inteiro:
SELECT
   CLIENTE,
   SUM( IF( MES = '2020-07', SOMA, 0 ) ) AS JULHO,
   SUM( IF( MES = '2020-06', SOMA, 0 ) ) AS JUNHO,
   SUM( IF( MES = '2020-05', SOMA, 0 ) ) AS MAIO
FROM
   (
   SELECT
      CLIENTE, DATE_FORMAT( DATA, '%Y-%m' ) AS MES, SUM( VALOR ) AS SOMA
   FROM VENDAS
   WHERE DATA BETWEEN '2020-05-01 AND 2020-07-31'
   GROUP BY CLIENTE, DATE_FORMAT( DATA, '%Y-%m' )
   ) AS PRIMEIROSELECT

GROUP BY CLIENTE

Lógico, não precisa ser nome grande, pode ser A, ao invés de PRIMEIROSELECT

Mas aqui já deu pra ter uma idéia de como as possibilidades são infinitas.

A partir daí, é pesquisar funções disponíveis, e tudo que pode ser feito.

Mas faltou uma coisa:
NÃO está limitado a uma tabela por vez, podemos buscar qualquer coisa de qualquer lugar, junto, misturado, relacionado, etc. etc.
É TUDO, qualquer informação de qualquer lugar, usando um único comando, tanto faz se a informação está parte em uma tabela ou parte em outra, ou de várias tabelas separadas.... é um único comando trazendo tudo de todas.

Nota: fui escrevendo os comandos durante o post, pode ter algum erro, mas é lógico... quando chegar a hora de usar, uma pesquisa rápida resolve qualquer eventual problema.
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 14:55

No comando acima
É interessante ter o nome dos clientes.
O que precisa?
o nome do campo, e fazer algum tipo de relacionamento entre o código desta tabela com o código da tabela de clientes

SELECT
   CLIENTE,
   TABCLI.NOME,
   SUM( IF( MES = '2020-07', SOMA, 0 ) ) AS JULHO,
   SUM( IF( MES = '2020-06', SOMA, 0 ) ) AS JUNHO,
   SUM( IF( MES = '2020-05', SOMA, 0 ) ) AS MAIO
FROM
   (
   SELECT
      CLIENTE, DATE_FORMAT( DATA, '%Y-%m' ) AS MES, SUM( VALOR ) AS SOMA
   FROM VENDAS
   WHERE DATA BETWEEN '2020-05-01 AND 2020-07-31'
   GROUP BY CLIENTE, DATE_FORMAT( DATA, '%Y-%m' )
   ) AS PRIMEIROSELECT
INNER JOIN TABCLI ON TABCLI.CODIGO = PRIMEIROSELECT.CLIENTE
GROUP BY CLIENTE
ORDER BY NOME


A atenção nisso é o seguinte:

INNER JOIN TABCLI ON TABCLI.CODIGO = PRIMEIROSELECT.CLIENTE

porque relacionei com o primeiro resultado e não com vendas?
porque pra somar cada um, não interessa o nome do cliente, seria só perda de tempo, então faço o relacionamento no "temporario" dos totais

e porque não relacionar com cliente do SELECT principal?
o select principal não existe, ele vai ser resultado da pesquisa.
Como ele vai ser encima do "primeiroselect", é exatamente esse que está disponível para o select principal/final e para fazer o relacionamento.

o resultado vai ser clientes em ordem alfabética, mostrando as vendas de cada mês, um em cada coluna.
Resultado pronto pra um browse/grid, ou pra um relatório.
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 15:04

Sou um quase principiante ensinando outros principiantes.

Considerem tudo apenas como didático, e não como forma de usar na prática.
Ainda estou aprendendo também... e pode ter jeito mais prático pra fazer essas mesmas coisas.
Quando minhas bases estiverem com milhões de registros vou poder dizer se tem jeito mais rápido pra isso.
Por enquanto, com algumas centenas de milhares de registros, tá atendendo bem.

Pra curiosidade.... no ADO isso é usado assim:

oResultado := oConexao:Execute( "comando SQL" )

Manda o comando pro servidor, e o servidor executa o comando e devolve o que o comando pediu.
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 15:55

Só reforçando novamente:

É o servidor SQL quem executa os comandos
Pode ser servidor MySQL, SQL Server, Firebird, etc.

E se é o servidor quem vai fazer o trabalho pesado....
tanto faz se usar ADO, SQLMIX, RDDSQL, etc. a velocidade vai ser a mesma.

Trata-se apenas de gosto pessoal, e de usar comandos SQL... se não usar comandos SQL não vai tirar vantagem nenhuma do servidor.
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor Fernando queiroz » 28 Jul 2020 18:27

cQuery1:="SELECT  "
   cQuery1+="FORPRO.PRODUTOS_ID,  "
   cQuery1+="FORPRO.DESPRO, "
   cQuery1+="produtos.TIPUNI,  "
   cQuery1+="produtos.PRECUS, "
   cQuery1+="produtos.ESTATU, "
   cQuery1+="produtos.ESTL02, "
   cQuery1+="ROUND((SUM(pedidositens.QTDPRO) / " + STRZERO(DAY(M->DAT_HOJE),2,0) + ") * " + STRZERO(PRAZO,3,0) + ") - (produtos.ESTATU + produtos.ESTL02) AS QTDPRO "
   cQuery1+="FROM ( "
   cQuery1+="SELECT DISTINCT forpro.FORNECEDOR_ID, forpro.PRODUTOS_ID, forpro.DESPRO "
   cQuery1+="FROM forpro ) AS FORPRO "
   cQuery1+="LEFT JOIN pedidositens ON pedidositens.PRODUTOS_ID = forpro.PRODUTOS_ID  "
   cQuery1+="JOIN pedidos ON DATE_FORMAT( pedidos.DATVEN, '%Y-%m') = '" + + STRZERO(YEAR(M->DAT_HOJE),4,0) + "-" + STRZERO(MONTH(M->DAT_HOJE),2,0) + +  "' AND pedidos.ST = '0' AND pedidos.PEDIDOS_Id = pedidositens.PEDIDOS_ID   "
   cQuery1+="LEFT JOIN produtos ON PRODUTOS.PRODUTOS_Id = forpro.PRODUTOS_ID  "
   cQuery1+="WHERE FORPRO.FORNECEDOR_ID = '" + STRZERO(nFORNECEDOR_ID,11,0) + "' "
   cQuery1+="GROUP BY forpro.PRODUTOS_ID  "
   cQuery1+="HAVING SUM(pedidositens.QTDPRO) > 0 AND (ROUND((SUM(pedidositens.QTDPRO) / " + STRZERO(DAY(M->DAT_HOJE),2,0) + ") * " + STRZERO(PRAZO,3,0) + ") - (produtos.ESTATU + produtos.ESTL02)) > 0  "
   cQuery1+="ORDER BY forpro.DESPRO "


demorei mas fiz essa query meio cabeluda, show de resultado , calcula o que deve ser comprado de um determinado fornecedor baseado nas vendas dos produtos fornecidos por ele, e usando um prazo e os produtos vendidos por data, pegando a data de venda do arquivo de PEDIDOS e os itens do arquivo de PEDIDOSITENS, verificando se o PEDIDO nao foi cancelado e se o calculo de compra foi maior que zero.
HARBOUR 3.2, HWGUI 2.22 B4, SEFAZCLASS, DBFCDX, PDFClass, LETODBF
Fernando queiroz
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 440
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 6 vezes
Mens.Curtidas: 16 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 19:27

Vai devagar aí, acho que tem coisa errada nisso.

Ao que parece, forpro tem todo mundo que pode fornecer produto.
Significa que se rodar um fornecedor de cada vez, pode comprar a mesma coisa de todos.

Usar o dia de hoje apenas, pode ser interessante no final do mês, e com isso a query fica presa a isso
Talvez mais interessante usar um período, últimos 30 dias por exemplo.

Se isto realmente for necessário:

"SELECT DISTINCT forpro.FORNECEDOR_ID, forpro.PRODUTOS_ID, forpro.DESPRO " + ;
"FROM forpro ) AS FORPRO " + ;

talvez melhor selecionar apenas o fornecedor que interessa WHERE FORNECEDOR_ID = variavel

Não sei se poderia ser mais interessante trazer os totais e depois um select pra preencher o que falta e fazer os cálculos adicionais

Como você mesmo disse, é cabeludo, e difícil pegar os detalhes.
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 20:15

não sei se entendi as tabelas
usando 30 dias pro cálculo

SELECT pedidositens.produtos_id, forpro.fornecedor_id, forpro.despro, 
produtos.precus, produtos.estatu, produtos.estl02,
SUM( pedidositens.qtdpro ) as vendido,round( sum( pedidositens.qtdpro ) * @prazo - ( produtos.estatu + produtos.estl02 ), 0 )

from pedidositens

inner join foxpro on forpro.produtos_id = pedidositens.produtos_id
inner join pedidos on pedidos.pedidos_id = pedidositens.pedidos_id
inner join produtos on produtos.produtos_id = pedidositens.produtos_id

where pedidos.datven between date_sub( curdate(), interval 31 day ) and date_sub( curdate(), interval 1 day )
and pedidos.st = '0'
and forpro.fornecedor_id = @IdFornecedor

group by pedidositens.produtos_id

having round( sum( pedidositens.qtdpro ) * @prazo - ( produtos.estatu + produtos.estl02 ), 0 ) > 0;
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor JoséQuintas » 28 Jul 2020 20:26

O detalhe das variáveis, das duas uma: ou altera o comando via fonte, ou cria e destrói variáveis no mysql.
E significa enviar os comandos, um de cada vez, antes de depois do anterior

SET @idfornecedor = 10
SET @prazo = 20
..... comando anterior
SET @idFornecedor = NULL
SET @prazo = NULL

No heidisql ele executa um de cada vez, e dá a impressão de que o MySQL aceita
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: 14689
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 13 vezes
Mens.Curtidas: 864 vezes

Tutorial de SQL

Mensagempor Fernando queiroz » 28 Jul 2020 21:22

Por incrível que pareça a coisa esta funcionando certinho, fiz vários testes com fornecedores variados e trouxe somente os certos, fiz o teste de São Tomé , na caneta e bateu certinho os cálculos , a única coisa que que também tive observações foi a questão do ANO/MES , mas era da forma que eles calculam.
HARBOUR 3.2, HWGUI 2.22 B4, SEFAZCLASS, DBFCDX, PDFClass, LETODBF
Fernando queiroz
Usuário Nível 3

Usuário Nível 3
 
Mensagens: 440
Data de registro: 12 Nov 2014 23:41
Cidade/Estado: Porto Alegre/RS
Curtiu: 6 vezes
Mens.Curtidas: 16 vezes

Próximo



Retornar para Contribuições, Dicas e Tutoriais

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