Página 1 de 5
Erro em comandos SQL
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
02 Set 2015 19:54
por Poka
Valeu Alexandre, deu certo
Poka
Erro em comandos SQL
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
20 Set 2015 16:09
por Poka
Obrigado Quintas e Alexandre pelas explicações.
Quintas, deu certo.
Poka
Erro em comandos SQL
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
02 Nov 2015 17:00
por Poka
Já consegui resolver.
Poka
Erro em comandos SQL
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
06 Nov 2015 11:19
por alxsts
Olá!
Pode mostrar a consulta SQL que está usando?
Erro em comandos SQL
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
08 Mar 2016 15:23
por JoséQuintas
Talvez parecido com isto?
not isnull( historico ) and Length( Trim( historico ) ) = 0
Erro em comandos SQL
Enviado:
08 Mar 2016 16:55
por Poka
V A L E U Quintas
um abraço
Poka
Erro em comandos SQL
Enviado:
10 Mar 2016 14:43
por alxsts
Olá!
Teste isto:
WHERE CHAR_LENGTH ( Trim( historico ) ) = 0 OR historico IS NULL
Erro em comandos SQL
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
09 Set 2016 15:58
por Poka
o FIRST tem sim.
valeu Quintas, vou testar aqui com esses exemplos.
Poka
Erro em comandos SQL
Enviado:
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
Enviado:
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
Enviado:
02 Jan 2017 19:44
por Poka
Valeu William
deu certinho
Um abraço e obrigado
Poka
Erro em comandos SQL
Enviado:
02 Jan 2017 19:57
por wmanesco
Beleza!
Erro em comandos SQL
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
04 Jan 2017 12:38
por alxsts
Erro em comandos SQL
Enviado:
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
Enviado:
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
Enviado:
15 Jan 2017 08:22
por Poka
Valeu Alexandre, obrigado.
Poka
Erro em comandos SQL
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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
Enviado:
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