Clipper On Line • Ver Tópico - Erro em comandos SQL
Página 1 de 5

Erro em comandos SQL

MensagemEnviado: 14 Ago 2015 11:02
por Poka
Olá a todos

Estou começando usar Firebird + ODBC

o select abaixo seria por exemplo +- como pegar todas as notas e a quantidade de itens de cada nota.

O grid vai ter por exemplo varias colunas

o select abaixo dá certo

     Str:="SELECT pd.codigo, count(pm.codigo) as qtdoc from PAGAR_DADOS pd  ";
       +" JOIN pagar_mov pm on (pm.codigo = pd.codigo) group by pd.codigo;"


o select abaixo com + de 1 campo da erro

     Str:="SELECT pd.codigo, pd.dtvenc, count(pm.codigo) as qtdoc from PAGAR_DADOS pd  ";
       +" JOIN pagar_mov pm on (pm.codigo = pd.codigo) group by pd.codigo;"


erro no segundo select

Error HY000 - [ODBC Firebird Driver][Firebird]Dynamic SQL Error
SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)


Se alguém puder ajudar, agradeço.

Poka

Erro em comandos SQL

MensagemEnviado: 14 Ago 2015 12:43
por alxsts
Olá!

Em SQL (vale para todos os SGBDs), quando se usa funções de agregação (aggregate functions), todas as colunas que não são usadas nestas funções devem obrigatoriamente constar da lista de colunas da cláusula GROUP BY. Exemplos de aggregate functions: Sum, Count, Avg...

Adapte a tua consulta:
Str:="SELECT pd.codigo, pd.dtvenc, count(pm.codigo) as qtdoc from PAGAR_DADOS pd ";
   +" JOIN pagar_mov pm on (pm.codigo = pd.codigo) group by pd.codigo, pd.dtvenc;"

Erro em comandos SQL

MensagemEnviado: 14 Ago 2015 14:17
por Poka
Valeu Alexandre, deu certinho.

Já estou fazendo algumas coisas com o Firebird, faz dias que estou nessa linha, pesquisei nos livros e apostilas que eu tenho, na internet e só vi exemplos com apenas um campo, não sabia que tinha que repetir no group by.

Obrigado

Poka

Erro em comandos SQL

MensagemEnviado: 14 Ago 2015 19:48
por JoséQuintas
Talvez mais fácil de entender:
Se estava totalizando por código, significa todos os vencimentos, então impossível definir uma data.
Se quer totais separados por código e vencimento, então são dois totalizadores.

Erro em comandos SQL

MensagemEnviado: 27 Ago 2015 11:34
por Poka
Olá

Jose Quintas, estou passando os dados dos arquivos + fáceis primeiro, vai ter aqueles relatórios de somar mês a mês do ano inteiro, aí vamos ver como fazer.

Bem por enquanto estou com outro problema:

Já sei que em comandos SQL não aceita aspas, fui passar tabela de clientes e um cliente que contém a palavra D´Agua por exemplo deu erro. Como fazer neste caso, posso simplesmente substituir por outra coisa. O usuário nunca vai poder usar esse tipo texto? .
Ainda não testei em campos tipo BLOB (memo), será que não vai aceitar também?.
Estou passando um sistema de advogado, e nos textos tem todos os tipos acentuação.
Existe outras silabas que os comandos SQL não aceita também? Aí vai ficar difícil para o advogado escrever os seus textos, explicar para ele que o sistema não aceita!!!

Como vocês fazem?

aguardo qualquer ajuda

Poka

Erro em comandos SQL

MensagemEnviado: 27 Ago 2015 12:16
por JoséQuintas
Aí vai ter que testar se vai ter problema com codepage.
Mas basicamente o MySql aceita qualquer coisa, basta usar a barra invertida "\" em casos que são exceção.

INSERT INTO CLIENTES ( NOME ) VALUES ( 'ANTONIO D\'AGUA' )


ou até mesmo a própria barra

INSERT INTO CLIENTES ( NOME ) VALUES ( 'TAMBEM ACEITA A BARRA \\' )


É por isso que uso uma função:

"INSERT INTO CLIENTES ( NOME ) VALUES ( " + StringSql( cTexto ) + ")"


E na função trato exceções, se existirem.

Erro em comandos SQL

MensagemEnviado: 27 Ago 2015 12:27
por JoséQuintas
Meu site inteiro sai de uma base MySql, exceto imagens.
Mesmo assim, dá pra gravar praticamente qualquer letra.
Uma página como exemplo do que pode ser gravado no MySql:

http://www.jpatecnologia.com.br/html/busca.asp?chave=Antigos&busca=nao

Erro em comandos SQL

MensagemEnviado: 02 Set 2015 14:48
por Poka
José Quintas, obrigado por responder.
Nos campos de nome vou substituir o ´ por outro caracter qualquer , não vai ter problemas, em campos Blob , aceita normal, esse era o meu medo , já que textos de advogado vocè ja viu, tem de tudo.

Agora + uma dúvida para alterações que não consegui resolver.

   Str:="UpDate &xarq set &ListaCampos  where &xCampoChave = &xconteudoTeste;"


esse comando funciona sem problemas, mas por ex, quando xcampochave = "codigo"
gostaria de testar com + de um campo, por ex: xcampoChave = docum+codFor.

Como sempre, nas apostilas e exemplos só tem com um campo.

Agradeço qualquer ajuda.

Poka

Erro em comandos SQL

MensagemEnviado: 02 Set 2015 17:21
por alxsts
Olá!

Em SQL é um pouco diferente. Tem que montar os critérios usando operadores lógicos. Exemplo:
UPDATE tbOrder
   SET idOrderStatus = 100
WHERE idCustomer = 7056
   AND dtOrder = '2015-08-31'

Erro em comandos SQL

MensagemEnviado: 02 Set 2015 19:54
por Poka
Valeu Alexandre, deu certo

Poka

Erro em comandos SQL

MensagemEnviado: 19 Set 2015 19:56
por Poka
Olá a todos

preciso de + uma ajuda

xtotkilos:=str( 5800,6,0)

str:="Update &xtabLan set TotKilos= 'xtotkilos' where codfor = '&xcodfor' .and. codprod = 'xcodprod';"


o comando acima funciona
eu preciso do seguinte
eu já tenho o campo totkilos prenchido na tabela , quero somar com o xtotkilos, se eu pesquisar antes, pegar o conteudo e somar tom totkilos dá certo, mas gostaria de fazer direto no comando.

agradeço qualquer ajuda.

Poka

Erro em comandos SQL

MensagemEnviado: 19 Set 2015 20:25
por JoséQuintas
Só comentário: evite usar macros, pode esconder problemas.
A velha pergunta... como faria no DBF?
(considerar que no SQL o default é todos)

USE tabela
REPLACE all totkilos WITH totkilos + 10 FOR codfor='005' and codpro='006'
USE


E no SQL?

UPDATE tabela SET totkilos = totkilos + 10 WHERE codfor = '005' and codprod='006';


Mas sem macro. Prefiro usar função pra deixar mais clara a conversão:
cSql := "UPDATE " + xtablan + " SET TotKilos=TotKilos +" + Str( nQtde ) + " WHERE codfor = " + StringSql( xcodfor ) + " AND codprod=" + StringSql( xcodprod )

FUNCTION StringSql( cString )
   RETURN ['] + cString + [']


Tem um detalhe interessante no MySql:
Se os campos codfor e codprod só contém números, mesmo sendo caractere, pode usar números no comando.

WHERE codfor=5 and codprod=6

Nota:
Lembre-se que .AND. é no Harbour e não no MySql. (com os pontos).

Erro em comandos SQL

MensagemEnviado: 20 Set 2015 14:07
por alxsts
Olá!
JoséQuintas escreveu:Tem um detalhe interessante no MySql:
Se os campos codfor e codprod só contém números, mesmo sendo caractere, pode usar números no comando.

Este comportamento existe em todos os sistemas gerenciadores de banco de dados relacionais, que não tem seus tipos de dados fortemente tipados. No mundo dos SGBDs, isto é conhecido como "conversão implícita de tipos". Não é uma boa prática pois pode causar erros nos resultados, lentidão no processamento e abertura de brechas para SQL injection, como mostrado no artigo Implicit type conversion in MySQL. O correto é o programador passar os argumentos já convertidos nos tipos corretos. Vejam mais um artigo relacionado: MySQL Type Conversion Rules

Erro em comandos SQL

MensagemEnviado: 20 Set 2015 16:09
por Poka
Obrigado Quintas e Alexandre pelas explicações.

Quintas, deu certo.

Poka

Erro em comandos SQL

MensagemEnviado: 07 Out 2015 16:32
por Poka
Olá

Esse comando aparentemente deveria dar certo
dá o erro ERROR 00000

É para deixar o campo codcli como not null ( flag = 1)

UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1 WHERE RDB$RELATION_NAME = 'dadopro' AND RDB$FIELD_NAME = 'codcli'


se alguém puder dar uma dica.

Poka

Erro em comandos SQL

MensagemEnviado: 07 Out 2015 17:23
por alxsts
Olá!

Aparentemente a sentença SQL está correta. Não entendi
Poka escreveu:É para deixar o campo codcli como not null ( flag = 1)
Se o conteúdo de uma coluna é null e você quer que ele deixe de ser null, é só atribuir um valor para ele, o que você já está fazendo.
Se quiser atribuir null para uma coluna, desde que ela permita, é só fazer
SET nome_da_coluna = NULL
Se quiser testar o nome da coluna para ver se é ou não null, uma das opções é
WHERE nome_da_coluna IS NULL OR nome_da_coluna_1 IS NOT NULL

Erro em comandos SQL

MensagemEnviado: 07 Out 2015 21:59
por Poka
Alexandre

quando eu executo o comando abaixo

alter table dadopro add PRIMARY KEY  ( codcli)


dá esse erro

Error HY000 - [ODBC Firebird Driver][Firebird]unsuccessful metadata update
Column: CODCLI not defined as NOT NULL - cannot be used in PRIMARY KEY constraint definition


estou entendendo que o campo necessita estar como not null

set tiver + alguma dica , agradeço

Poka

Erro em comandos SQL

MensagemEnviado: 08 Out 2015 01:51
por alxsts
Olá!

A sintaxe seria esta:
ALTER TABLE dadopro ADD CONSTRAINT PK_dadopro  PRIMARY KEY(codcli);
Se continuar dando este erro que você mostrou, será necessário alterar as propriedades da coluna codcli para NOT NULL e o comando é este mesmo que você mostrou. Não sei qual a razão do erro mas, tente fazer um "quebra galho". Supondo que o tipo de dados da coluna codcli seja BIGINT, crie uma coluna a mais na tabela:
ALTER TABLE dadopro ADD tmp_codcli BIGINT NOT NULL;
COMMIT;
O próximo passo será jogar todos os codcli para a nova coluna. Naturalmente, nenhum codcli poderá estar com o valor NULL. Se existir algum NULL nesta coluna, você precisará atribuir um código único e não NULLo para ela, em cada registro que estiver netas condições.
Resolvida a questão dos NULL, preencha a coluna tmp_codcli:
UPDATE dadopro SET tmp_codcli = codcli
Se quiser, você poderá mover a nova coluna para a posição 1 da tabela:
ALTER TABLE dadopro ALTER tmp_codcli POSITION 1;
Feito isto, tente criar a PK:
ALTER TABLE dadopro ADD CONSTRAINT PK_dadopro  PRIMARY KEY(tmp_codcli);
Se der certo delete a coluna codcli antiga
ALTER TABLE dadopro drop codcli;
e renomeie a coluna temporária para o nome antigo:
ALTER TABLE dadopro alter tmp_codcli to codcli;
Naturalmente, estas operações tem que ser feitas quando o banco não estiver sendo usado por outros usuários. Também é preciso levar em conta as dependências desta tabela, como foreign keys, stored procedures, triggers, views. Nem é preciso dizer que fazer backup da tabela antes é essencial. Para isto, use:
SELECT * INTO dadopro_bkp FROM dadoopro;

Erro em comandos SQL

MensagemEnviado: 01 Nov 2015 17:05
por Poka
Olá,

Tenho um arquivo de (produto), nesse arquivo não costumo salvar o estoque atual.

Tenho outro arquivo de controle da ficha de estoque (Fichaest) .
Esse arquivo Fichaest contém o movimento de todos os produtos, ele está em ordem de codigo do produto + data, assim
consigo pegar o saldo de qualquer produto, em qualquer data, isto em dbf.
Agora com o Firebird, não estou vendo como pegar esse saldo.

Em dbf eu tinha uma função PegaSaldo(codigo produto, data).
Era só dar um scope , dava um seek numa data maior, retrocedia 1 e estava com o saldo nas mãos.
Não estou vendo jeito de fazer isso com Select.

Imagina o arquivo Fichaest com codigo 10 com lançamentos no mês de dezembro do dia 1 ao dia 31, quero pegar o saldo do dai 15, e no dia 15 tenho varios lançamentos, como fazer num select?

Alguém pode dar alguma idéia?

Poka

Erro em comandos SQL

MensagemEnviado: 01 Nov 2015 17:16
por JoséQuintas
Precisa ter alguma ordem.
É selecionar o último lançamento da data.

Dependendo do banco de dados, poderia ser numa destas formas

SELECT * FROM ESTMOV WHERE CODIGO=10 AND DATA='2015-11-01' ORDER BY LANCTO DESC LIMIT 1

SELECT TOP 1 * FROM ESTMOV WHERE CODIGO=10 AND DATA='2015-11-01' ORDER BY LANCTO DESC

Erro em comandos SQL

MensagemEnviado: 02 Nov 2015 11:40
por Poka
Valeu Quintas.
Vou testar amanhã, se não der certo volto aqui.
O desc matou a charada.

Poka

Erro em comandos SQL

MensagemEnviado: 02 Nov 2015 16:00
por Poka
Quintas,
testei agora aqui e deu certo.
Dá certo quando a data que procuro tem lançamento .

Imagina o seguinte na ficha de estoque
no mês de outubro tem movimento do dia 1 ao dia 10 e do dia 20 ao 30.
Para pegar o saldo do dia 15 preciso saber o saldo anterior, que é o saldo do dia 10.

Tem alguma idéia?

Grato

Poka

Erro em comandos SQL

MensagemEnviado: 02 Nov 2015 17:00
por Poka
Já consegui resolver.

Poka

Erro em comandos SQL

MensagemEnviado: 02 Nov 2015 23:30
por alxsts
Olá!

Muito boa a questão, para quem gosta de desafios SQL. Poderia compartilhar a solução encontrada?

Antes de você informar que havia solucionado, eu estava tentando montar uma solução. Considerando os detalhes do tópico anterior, cheguei na consulta abaixo, considerando que a coluna data seja do tipo DateTime:
SELECT * 
  FROM MovEst
WHERE codigo = 10
   AND data = (SELECT MAX(data)
                     FROM MovEst
                    WHERE codigo = 10
                      AND Cast(data as Date) <= Cast( '2015-10-15' as Date ) )

Nestes casos, ajuda muito informar o layout das tabelas envolvidas. Na tabela MovEst, qual é o tipo de dados da coluna que armazena a data do movimento? Se for um campo que armazena a data e hora, ficará mais fácil. Caso contrário, talvez precise de outra coluna que identifique a sequencia do lançamento, como disse o Quintas.

Erro em comandos SQL

MensagemEnviado: 04 Nov 2015 07:35
por Poka
Olá Alexandre,

Obrigado por responder

Realmente um campo de controle de sequencia se faz necessário para pegar o saldo válido

func fSaldo(xcodigo,xdata)
    /*
    fb_executa sempre me retorna  a matriz m_select com as linhas recuperadas
   -nControl é o campo de controle que tem 17 digitos, uso uma funcao do firebird
   que me retorna ano,mes,dia,hora,minuto,segundo e fracao de segundo, assim nunca se repete
   formação de nControl  AAAAMMDDHHMMSSFFF
   - fb_data retorna a data no formato correto para teste com o firebird
   */
   local vsaldo:=0
   //
   str:="select first 1 e.qtdSldAt  from fichaEst e where e.codprod = "+ xcodigo;
   +" and  e.data = '"+fb_data(xdata) +"' order by e.data , nControl desc ;"
   //
   fb_executa()
   if empty(m_select)
      // se nao encontrar procuro o saldo anterior
      // pego a data anterior , aqui preciso da data anterior ,  nem sempre a data anterior é o dia  anterior
      str:="select first 1  e.data  from fichaEst e where e.codprod = "+ xcodigo ;   
      +" and  e.data < '"+fb_data(xdata) +"' order by e.data desc ;"
      fb_executa()
      // se m_select retornar vazio, não tem nenhum lancamento anterior
      if empty( len(m_select)  )
         vsaldo:=0
      else
         // pesquiso a data anteriror
     xdata:=m_select[1,1]
          str:="select first 1 e.qtdSldAt  from fichaEst e where e.codprod = "+ xcodigo;
     +" and  e.data = '"+fb_data(xdata)   +"' order by e.data , nControl desc ;"
      fb_executa()
           vsaldo:=( m_select[1,1])
       endif         
   else
       vsaldo:=( m_select[1,1])
   endif         
retu vsaldo


PROBLEMA

em um relatório com 260 produtos para realizar compras, onde preciso do saldo atual de cada produto, demora cerca de 8 segundos, com dbf era praticamente instantâneo. O meu computador é bem fraco, pode ser que num servidor não venha fazer diferença ( ou notar a diferença). Imagina no select para procurar a data anterior tiver milhares de lançamentosm, em um único produto é instantâneo, agora uma lista com 5 mil produtos!!!.

Vou tentar fazer uns testes com a cláusula Max que você passou para ver se tem jeito também, quem sabe dá alguma diferença.

Poka

Erro em comandos SQL

MensagemEnviado: 04 Nov 2015 09:38
por alxsts
Olá.

A tabela do banco tem que ter PK e índice. Poste o script de criação desta tabela.

Erro em comandos SQL

MensagemEnviado: 04 Nov 2015 12:21
por JoséQuintas
Como já comentamos por aqui, pra tirar proveito da base de dados em SQL é usar o mínimo possível.
Fazer uma consulta complexa é mais rápido do que fazer várias consultas simples.
Então nesse caso o ideal é um comando que já traga TODOS os cálculos prontos, de TODOS os produtos.

Ainda não cheguei nessa parte no meu aplicativo, mas talvez este post ajude a ter alguma idéia.

http://www.pctoledo.com.br/forum/viewtopic.php?f=42&t=16136

Erro em comandos SQL

MensagemEnviado: 06 Nov 2015 11:06
por Poka
Olá
Fazendo um teste aqui, o arquivo que controla o estoque tem +- 35.000 registros de todos os códigos.
O relatório pega os produtos que tem estoque minimo maior que zero. Dá +- 250 produtos, demora 2 minutos e 40 segundos. Em dbf - de 5 segundos.

Quintas , não vi como consultar tudo de uma só vez nesse caso.
Alexandre veja como está o índice (anexo).

Será que tem jeito de melhorar a performance?

Poka

Erro em comandos SQL

MensagemEnviado: 06 Nov 2015 11:19
por alxsts
Olá!

Pode mostrar a consulta SQL que está usando?

Erro em comandos SQL

MensagemEnviado: 06 Nov 2015 13:42
por Poka
Mx contém os codigos dos produtos
Msaldo guarda os saldos dos produtos

for a:= 1 to len(mx)
 
      msaldo[a]:=fsaldoPa( mx[a,1] ,servData)         

next


FUNC FSALDOPA(XCODIGO,XDATA)
         // RETORNA O SALDO DA DATA
         // fb_executa() retorna o resultado na matriz m_select
         LOCAL VSALDO:=0
         //
         str:="select first 1 e.qtdSldAt from fichapaCI e where e.codprod = "+ xcodigo;
   +" and  e.data = '"+fb_data(xdata)    +"' order by e.data, e.fb_control desc ;"
         x:=fb_executa()
         *--------------
         if empty(m_select)
            // se nao encontrar procuro o saldo anterior
            // pego a data anterior
            str:="select first 1  e.data  from fichapaCI e where e.codprod = "+ xcodigo ;
                  +" and  e.data < '"+fb_data(xdata) +"' order by e.data desc ;"
            x:=fb_executa()
            if empty( len(m_select)  )
                     vsaldo:=0      // nao tem lancamento anterior
                  else   
                     xdata:=m_select[1,1]
               str:="select first 1 e.qtdSldAt  from fichapaCI e where e.codprod = "+ xcodigo ;
                           +" and  e.data = '"+fb_data(xdata)      +"' order by e.data , fb_control desc ;"
             x:=fb_executa()
               vsaldo:=( m_select[1,1])
      endif         
   else
            vsaldo:=( m_select[1,1])
   endif         
         *--------------
   
retu vsaldo


Poka

Erro em comandos SQL

MensagemEnviado: 06 Nov 2015 15:10
por JoséQuintas
Com certeza não é o ideal, mas se entendi direito, este comando já agilizaria um pouco, apesar de ainda ser um produto por vez.

"SELECT FIRST 1 E.DATA, E.QTDSLDAT FROM FICHACI E WHERE E.CODPROD=" + XCODIGO ;
+ " AND E.DATA <=" + FB_DATA( XDATA ) + " ORDER BY E.DATA, E.FB CONTROL DESC"


O que tem em mx? Todos os produtos, ou somente uma seleção?

Erro em comandos SQL

MensagemEnviado: 06 Nov 2015 15:30
por JoséQuintas
Testei isto no mysql:

select 
     qcip, qcqtd, max( qcdatetime )
     from JPCEPQTD
     group by qcip
     order by qcdatetime desc


Tudo indica que retornou IP, qtde de consultas, e data referentes à última consulta de cada IP.
Para o caso do estoque, acrescentar condição data <= limite, e ordem ( data + lancto ) decrescente

Foi instantâneo, mas só tem 13.000 registros.

Erro em comandos SQL

MensagemEnviado: 08 Mar 2016 12:46
por Poka
Olá a todos

José Quintas e Alexandre, quanto ao problema anterior, ainda vou voltar a mexer e retorno, por enquanto a situação é a seguinte :

quero deletar todos os registros que tem o hostórico vazio ( não está como null)

Não vi no firebird uma função tipo empty ou len para fazer o teste

por exemplo se tivesse o empty
str:=" delete from movpro where empty(historico);"

Tem alguma idéia como fazer?

Poka

Erro em comandos SQL

MensagemEnviado: 08 Mar 2016 15:23
por JoséQuintas
Talvez parecido com isto?

not isnull( historico ) and Length( Trim( historico ) ) = 0

Erro em comandos SQL

MensagemEnviado: 08 Mar 2016 16:55
por Poka
V A L E U Quintas

um abraço

Poka

Erro em comandos SQL

MensagemEnviado: 10 Mar 2016 14:43
por alxsts
Olá!

Teste isto:
WHERE CHAR_LENGTH ( Trim( historico ) ) = 0 OR historico IS NULL

Erro em comandos SQL

MensagemEnviado: 11 Mar 2016 15:45
por Poka
Olá ,

Quintas,
str:=" select data , codproce from "+xarquivo+" where not isnull( historico ) and Length( Trim( historico ) ) = 0 ;"  

dá esse erro na execução
Error HY000 - [ODBC Firebird Driver][Firebird]Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 68
and

fiz assim e deu certo, não sabia que tinha o TRIM no Firebird
str:="select data , codproce from "+xarquivo+" where trim(historico)='';"    

Alexandre, deu certo também
str:=" select data , codproce from "+xarquivo+" where  CHAR_LENGTH ( Trim( historico ) ) = 0 OR historico IS NULL    ;"      


Obrigado a todos

Poka

Erro em comandos SQL

MensagemEnviado: 11 Mar 2016 16:41
por alxsts
Olá!

Apenas para enriquecer o tópico:

IsNull é uma função do SQL Server que retorna o valor especificado caso o outro valor contenha NULL.

Exemplos SQL Server:

-- considerando que o campo x seja do tipo alfanumérico
SELECT IsNull( x, 'Campo nulo' )

-- considerando que o campo x seja do tipo numérico
SELECT IsNull( x, 0 )

-- considerando que o campo x seja do tipo datetime
SELECT IsNull( x, '1900-01-01T00:00:00.000' )


No Firebird não existe esta função mas pode-se usar a função Coalesce que também existe no SQL Server:
-- considerando que o campo x seja do tipo alfanumérico
SELECT Coalesce( x, 'Campo nulo' )


No MySQL e MariaDB, existe a função IfNull() que corresponde à IsNull() do SQL Server. A Coalesce() também existe nos dois.

Coalesce() é diferente de IsNull() e IfNull() pois aceita uma lista de vários valores como parâmetro e retorna o primeiro não NULL, caso exista:
SELECT COALESCE(NULL,NULL,1);     -> retorna 1

SELECT COALESCE(NULL,NULL,NULL);  -> retorna NULL


As funções Coalesce(), IsNull() e IfNull() são diferentes do operador IS [NOT] NULL.

Coalesce IsNull IfNull NULL

Erro em comandos SQL

MensagemEnviado: 06 Set 2016 16:53
por Poka
Olá a todos

Um tabela de notas com 30.000 notas +-
gostaria de mostrar somente a 10 ultimas notas AUTORIZADAS e as que estiverem com status NÃO AUTORIZADAS.

exemplo campos docum e status ( 1 NÃO AUTORIZADAS E 2 AUTORIZADAS).

e também mostrar em ordem ascendente

ex:

select first 10 docum from notaD order by docum desc

consigo pegar as últimas , mas mostra em ordem descendente, se eu organizar a matriz\ resolve, mas tem como fazer tudo no select?.
e também acrescentar as não autorizadas. Então seria 10 ultimas (autorizadas) mais as (não autorizadas) em ordem ascendente.

Agradeço qualquer ajuda.

Poka

Erro em comandos SQL

MensagemEnviado: 06 Set 2016 18:15
por JoséQuintas
Se não for de um jeito, vai de outro.... rs

Tem o sub-select, e tem a união de select.
No MySQL, talvez isto:


SELECT * FROM
   (
      SELECT DOCUM, STATUS FROM NOTAD WHERE STATUS = 1
      UNION ALL
      SELECT DOCUM, STATUS FROM NOTAD WHERE STATUS=2 ORDER BY DOCUM DESC LIMIT 10
   ) AS NOTAS
   ORDER BY DOCUM


Acho que deu pra entender.
São dois selects, junta o resultado dos dois, e depois coloca tudo em ordem.

Erro em comandos SQL

MensagemEnviado: 09 Set 2016 14:35
por Poka
Olá Quintas
Obrigado por responder.
Está dando erro na cláusula LIMIT
-comando desconhecido
uso o firebird , deve ser por isso, não vi essa cláusula no select do firefird.
se tiro o firebird dá erro no ultimo order by
- comando inválido
estranho, não era para dar.
mas com Union all acho que dá chegar no que eu quero, vou tentando aqui, se você tiver mais alguma idéia....

Obrigado

Poka

Erro em comandos SQL

MensagemEnviado: 09 Set 2016 14:57
por JoséQuintas
Se não me engano, chegou a usar num post anterior, e seria FIRST.

No MySQL é LIMIT
No SQL Server é TOP
No Firebird acho que é FIRST

Erro em comandos SQL

MensagemEnviado: 09 Set 2016 15:19
por JoséQuintas
Eu usava esta nos DBFs, me baseei nela
Agrupar totais por data, de três documentos diferentes.

select
   cnDatEmi DtEmissao, count(*) CtrcQtd, Sum(cnPeso) CtrcPeso, Sum(cnValor) CtrcValor, Sum(cnVlMerc) ValorMerc, 0 CFQtd, 0 CFValor, 0 ColetaQtd, 0 ColetaVlr, 0 ColVlMerc
   into lixo
   From gtconhe
   group by DtEmissao
union all
select
   cfDatEmi DtEmissao, 0 CtrcQtd, 0 CtrcPeso, 0 CtrcValor, 0 ValorMerc, count(*) CFQtd, Sum(CFValor) CfValor, 0 ColetaQtd, 0 ColetaVlr, 0 ColVlMerc
   From gtcontr
   group by DtEmissao
union all
Select
   ceDatEmi DtEmissao, 0 CtrcQtd, 0 CtrcPeso, 0 CtrcValor, 0 ValorMerc, 0 CFQtd, 0 CFValor, Count(*) ColetaQtd, Sum(ceValFat) ColetaVlr, Sum(jpnftr1.ntValor) ColVlMerc
   from jpordem
   left join jpnftr1 on jpordem.ceNumLan = jpnftr1.ntColeta
   group by DtEmissao


Tentei agora no MySQL, e ele não se deu bem com o limit.
Mas funcionou assim:

select * from 
( select kkchave as x from jpnfekey limit 10 ) AS x1
union all
select * from
( select kkchave as x from jpnfekey limit 10 ) as x2

Erro em comandos SQL

MensagemEnviado: 09 Set 2016 15:23
por JoséQuintas
E expandindo, assim:

select * from 
(
   select * from
      ( select kkchave as x from jpnfekey limit 10 ) AS x1
   union all
   select * from
      ( select kkchave as x from jpnfekey limit 10 ) as x2
) AS x3

ORDER BY x


Como eu disse, não vai de um jeito, vai de outro.... rs

Erro em comandos SQL

MensagemEnviado: 09 Set 2016 15:58
por Poka
o FIRST tem sim.

valeu Quintas, vou testar aqui com esses exemplos.

Poka

Erro em comandos SQL

MensagemEnviado: 02 Jan 2017 18:10
por Poka
Olá a todos.

Quintas, só respondendo a anterior, com o First deu certo.

Agora uma outra dúvida

tenho duas tabelas
grupo e produto

em grupo tenho os campos, codigo , nome, temSt, revenda e ncm
em produtos tenho codigo,nome, temst,revenda, ncm e codGrupo

preciso imprimir uma listagem com com as colunas

codigo e nome do grupo, temst,revenda, e ncm

e abaixo de cada grupo todos os produtos pertencentes a esse grupo
onde está 000 e 999 são variaveis que pode ser todos ou só uma faixa de grupos

pode ser de grupos pegar os produtos, ou de produto pegar os grupos.


tentei o comando abaixo, mas não deu certo, tentei com 2 selects , join ,tem alguma sugestão?
select g.codigo,g.nome, g.temst,g.revenda,g.ncm,p.codgrupo,p.nome from grupo g,produto p  where g.codigo >='000' and g.codigo <= '999'  and  p.codgrupo >= '000' and p.codgrupo <= '999' order by g.codigo;

Poka

Erro em comandos SQL

MensagemEnviado: 02 Jan 2017 18:45
por wmanesco
Acho que seria com JOIN.

SELECT g.codigo, g.nome,g.temst, g.revenda, g.ncm, p.nome FROM grupo g LEFT JOIN produtos p ON g.codigo = p.codGrupo ORDER BY g.codigo;


Ai se quiser pode colocar os WHERE dos códigos menores do que 999

Erro em comandos SQL

MensagemEnviado: 02 Jan 2017 19:44
por Poka
Valeu William

deu certinho

Um abraço e obrigado

Poka

Erro em comandos SQL

MensagemEnviado: 02 Jan 2017 19:57
por wmanesco
Beleza!

Erro em comandos SQL

MensagemEnviado: 04 Jan 2017 09:42
por Poka
Olá a todos

Incluir, alterar, excluir, já fiz as minha rotinas está tudo tranquilo, agora vem os relatórios onde vai ter rotinas que ter ir pedindo ajuda aqui aos colegas.

A situação agora é a seguinte.

Passei os dados de um sistema antigo de dbf para FB.
Tenho o arquivo de itens das notas com +- 700.000 itens.
tabela nota_m com um campo nItem com tamanho de 3 tipo caracter, onde gravo 001,002 etc

nessa tabela tem notas com 1 item, 5 itens etc, precisaria preencher esse campos de cada nota com a numeração de itens.

Str:="UpDate nota_m set nitem = ''001'';"

assim eu gravo todos com "001"
Será que tem como gravar a numeração de cada item , de acordo com a quantidade de cada nota?

Poka

Erro em comandos SQL

MensagemEnviado: 04 Jan 2017 11:40
por alxsts
Olá!

Como ponto de partida, sugiro que leia o artigo The Difference Between ROW_NUMBER(), RANK(), and DENSE_RANK(), em Inglês. No caso do Firebird, estes recursos estão disponíveis a partir da versão 3.0.

Erro em comandos SQL

MensagemEnviado: 04 Jan 2017 12:08
por Poka
Alexandre, obrigado por responder, uso a versão 2.5.
Não sei se mudar para a versão 3 vou ter que alterar muita coisa, se tiver que alterar, vou ficar na 2.5 mesmo por enquanto.
esse campo não é tão importante assim. Se ficar em branco não vai interferir em nada.

Obrigado

Poka

Erro em comandos SQL

MensagemEnviado: 04 Jan 2017 12:38
por alxsts

Erro em comandos SQL

MensagemEnviado: 12 Jan 2017 14:37
por Poka
Olá

Alexandre, sobre a rotina anterior, ainda vou voltar nela, estou indo aos "pedaços".

O comando abaixo acho que peguei aqui mesmo no fórum.

insert into table1 (nome) select (nome) from table2;

insere os nomes da tabela table2 na tabela table1.

tem como inserir todos os campos de uma tabela em outra.

uso bastante isso, criei as minhas funções para esse trabalho, para não ter que relacionar todos os campos, mas esse comando parece bem simplicado, tenho arquivo com +- 240 campos no arquivo de notas por exemplo. Testei com algumas alterações, mas não deu certo.

Poka

Erro em comandos SQL

MensagemEnviado: 14 Jan 2017 16:22
por alxsts
Olá!

Leia o tópico Copiando dados com SQL. Creio que possa te ajudar.

Erro em comandos SQL

MensagemEnviado: 15 Jan 2017 08:22
por Poka
Valeu Alexandre, obrigado.

Poka

Erro em comandos SQL

MensagemEnviado: 07 Fev 2017 13:14
por Poka
Olá a todos

Alexandre, peguei este exemplo seu
SELECT * INTO b FROM a WHERE 1 = 0


estou fazendo assim

select * into teste from notad where 1=0;


dá o erro abaixo

Error HY000 - [ODBC Firebird Driver][Firebird]Dynamic SQL Error
SQL error code = -104
Token unknown - line 1, column 10
Into


Poderia dar uma ajuda, não consegui ver o erro.
Quero criar um temporário vazio (só com a estrutura).


Poka

Erro em comandos SQL

MensagemEnviado: 08 Fev 2017 17:12
por alxsts
Olá!

Pelo que li pesquisando no Google, oFirebird não suporta este recurso. Tem que usar alguma ferramenta tipo FlameRobin

Erro em comandos SQL

MensagemEnviado: 10 Fev 2017 14:16
por Poka
Obrigado Alexandre, eu tenho a minha função para fazer esse trabalho, mas esse comando era interessante, acho que aqueles outros comandos também não irão funcionar, mas valeu.

Um abraço

Poka

Erro em comandos SQL

MensagemEnviado: 22 Fev 2017 16:43
por Poka
Olá a todos.

Este comando deveria trazer o db_key do registro?. Não dá erro, vem com um carácter estranho. Tem como pegar esta informação do registro?


"select RDB$DB_KEY from tabela;"


Poka

Erro em comandos SQL

MensagemEnviado: 11 Abr 2017 13:11
por Poka
Olá a todos

assim dá certo

xicms:=str(12.00,5,2) 
  str:="update nomeTab  set alicms = '"+xicms+"';"



assim dá erro porque estou somando número com string
já tentei com CAST, mas não consegui.

  xicms:=12.00 
  str:="update nomeTab  set alicms = '"+xicms+"';"


teria que transformar o numérico em string na linha de comando.

alguém tem algum exemplo?

Poka

Erro em comandos SQL

MensagemEnviado: 11 Abr 2017 18:40
por alxsts
Olá!

Você mesmo respondeu... tem que converter.

Achei estranho o valor da alíquota estar entre apóstrofes, indicando que a coluna da tabela no banco é do tipo carácter. Neste caso, a variável numérica xicms tem que ser convertida para string e o resultado colocado entre aspas ou apóstrofes no comando SQL:
xicms := 12.00
cStr :="update nomeTab  set alicms = ' " + AllTrim( Str( xicms, 5,2 ) ) + " ' ;"


Se o tipo de dados na tabela for numérico, ficaria assim:
xicms := 12.00
cStr :="update nomeTab  set alicms = " + AllTrim( Str( xicms, 5,2 ) ) + ";"


O mais indicado é criar funções que retornem os valores já convertidos e, quando necessário, entre aspas ou apóstrofes.

Erro em comandos SQL

MensagemEnviado: 11 Abr 2017 19:25
por JoséQuintas
Ou, talvez mais fácil de decidir, veja a string que precisa e se a fórmula retornou a string correta.

update nometab set alicms = '12.00'
update nometab set alicms = 12.00

Erro em comandos SQL

MensagemEnviado: 12 Abr 2017 08:33
por Poka
Obrigado Alexandre e Quintas.

cStr :="update nomeTab  set alicms = " + AllTrim( Str( xicms, 5,2 ) ) + ";"


já tinha testado com str e não dava, acho que tinha feito algo errado. Mas deu certo, inclusive com com apóstrofes se sem.

Poka

Erro em comandos SQL

MensagemEnviado: 12 Abr 2017 10:02
por JoséQuintas
É apenas uma sugestão:

Como vai usar muito, ao invés de AllTrim( Str() ) pode ser interessante criar sua própria função, por exemplo NumberSql()
Não parece, mas se usa muito, vai ajudar até a reduzir o tamanho do EXE, além de padronizar.

FUNCTION NumberSql( xValue, nInt, nDec )

   RETURN AllTrim( Str( xValue, nInt, nDec ) )


Em termos de fonte, está trocando a chamada de duas funções por uma única chamada.
Supondo que use 1.000 vezes, vai reduzir 1.000 chamadas em fonte, ou reduzir pela metade.

E pode fazer o mesmo pra strings, datas, etc.

Só um comentário extra:
Não sei se postou apenas parte do comando, mas isso trocaria o arquivo inteiro de uma vez.
Ao contrário do xbase, em SQL o default é todo o arquivo, e não apenas o registro atual.

Erro em comandos SQL

MensagemEnviado: 12 Abr 2017 14:42
por Poka
Bem lembrado Quintas, já tenho uma função para data, realmente facilita bastante.

Obrigado

Poka

Erro em comandos SQL

MensagemEnviado: 12 Abr 2017 19:44
por alxsts
Olá!

Poka escreveu:Mas deu certo, inclusive com com apóstrofes se sem.

Isto ocorre porque o otimizador de queries do SGBD executa o comportamento padrão dele, chamado de conversão implícita,sempre que possível. Assim, se o comando manda gravar uma string em uma coluna de tipo numérico, o otimizador converte a string para numérico. Caso tente gravar um numérico em um campo string, converte o numérico para string. Não dá erro mas, consome mais recursos. O ideal é enviar sempre o valor representado no tipo de dados igual ao da coluna da tabela.

JoséQuintas escreveu:Como vai usar muito, ao invés de AllTrim( Str() ) pode ser interessante criar sua própria função, por exemplo NumberSql()
alxsts escreveu:O mais indicado é criar funções que retornem os valores já convertidos e, quando necessário, entre aspas ou apóstrofes.

Erro em comandos SQL

MensagemEnviado: 13 Abr 2017 16:41
por Poka
Obrigado Alexandre pela explicação.
mais uma situação .
na linha abaixo por exemplo.
 "update  nomeTabela  set  vlcofins = vlmerc*3.78/100;"

ok
 "update  nomeTabela  set  vlcofins = vlmerc/100*3.78;"

Dá diferença de centavos, isto porque o resultado da divisão, considera somente 2 casas, como fazer para considerar 5 casas decimais por exemplo.
não vi uma função no firebird para essa situação.

Obrigado
Poka