Fórum Select (Duas duvidas) #295229
12/09/2005
0
Ferramentas usadas:
------------------------
Interbase 6.0 / FireBird 1.5
Delphi 7
primeiro problema
----------------------
O Campo ´código´ da tabela livros era Integer. O select abaixo funcionava (ele selecionava o maior numero do campo código e gerava um numero acima, ou seja se o maior código fosse ´1´, ele gerava o codigo ´2´), porém agora que precisei mudar o tipo do campo para ´FLOAT´ ele não funciona... alguem saberia me dizer o porque?
DM.qry_MatCod.Open; DM.qry_MatCod.SelectSQL.Clear; DM.qry_MatCod.SelectSQL.add(´SELECT (MAX(CODIGO) + 1 ) PROX FROM LIVROS ´); // o problema está nesse select... dm.qry_MatCod.open; cod := dm.qry_MatCod.fields[0].AsInteger; if cod = null then begin cod:=0; end else cod:=cod; DM.qry_MatCod.Close; Edit_Codigo.Text := IntToStr(cod);
Segundo problema:
-----------------------
- Tive que mudar o tipo do campo por que antes o meu sistema gerava um numero inteiro sequencial, e agora ele terá que gerar um numero com ponto decimal, do tipo ´10.5´, onde o numero antes do ponto será o código do material, e o numero após o ponto será o código da área.
- Tudo bem assim que conseguisse descobrir a solução para o ´Primeiro problema´, eu teria que reformular o código para gerar esses materiais onde:
1. O sistema teria que checar a area(campo código da tabela area) que eu escolhi para poder saber qual será o código que irá apos o ponto decimal.
2. O sistema teria que selecionar o maior numero(campo código da tabela livros) antes do ponto decimal, que tivesse o numero da checagem ´1.´ após o ponto decimal, e gerar um numero acima.
Exemplo: se o maior numero fosse 10.5 , o sistema iria gerar 11.5
Para começar tenho alguma coisa... quem puder me ajudar com o código abaixo fico grato:
procedure TMateriais.Btn_NovoClick(Sender: TObject); var Cod : Integer; begin DM.qry_ArCod.Open; DM.qry_ArCod.SelectSQL.Clear; DM.qry_ArCod.SelectSQL.add(´select codigo from area where NOME = ´+combo_area.text;); dm.qry_ArCod.open; DM.qry_MatCod.Open; DM.qry_MatCod.SelectSQL.Clear; DM.qry_MatCod.SelectSQL.add(´SELECT (o maior numero antes do ponto decimal, que tivesse o numero do SELECT acima após o ponto decimal, e gerar um numero acima.) PROX FROM LIVROS ´); // Lembrando: CODIGO = FLOAT dm.qry_MatCod.open; cod := dm.qry_MatCod.fields[0].AsInteger; if cod = null then begin cod:=0; end else cod:=cod; DM.qry_MatCod.Close; Edit_Codigo.Text := IntToStr(cod); end;
Mahdak
Curtir tópico
+ 0Posts
12/09/2005
Mahdak
Erro:
------
Qry_MatCod: Type mismatch for field ´PROX´, expecting: LargeInt: Float
var Cod : Double; DM.qry_MatCod.Open; DM.qry_MatCod.SelectSQL.Clear; DM.qry_MatCod.SelectSQL.add(´SELECT (MAX(CODIGO) + 1 ) PROX FROM LIVROS ´); dm.qry_MatCod.open; cod := dm.qry_MatCod.fields[0].AsFloat; if cod = null then begin cod:=0; end else cod:=cod; DM.qry_MatCod.Close; Edit_Codigo.Text := FloatToStr(cod);
Gostei + 0
13/09/2005
Ehvasc
Gostei + 0
13/09/2005
Michelli88
Mas quando eu usava [b:ad37f24c07]interbase[/b:ad37f24c07] e eu mudava o tipo de algum campo... tinha que apagar o campo do [b:ad37f24c07]fieldEditor[/b:ad37f24c07] de todas as querys.. e adicionar novamente e tb dependendo do componente q vc usa pra gerar os sqls, vc tem q gerar tudo denovo. Se vc ta usando o [b:ad37f24c07]IBUpdateSql[/b:ad37f24c07] eh soh abrir e gerar novamente, mesma coisa se vc estiver usando a [b:ad37f24c07]IBDataset [/b:ad37f24c07]se nao me engano...[/color:ad37f24c07][/size:ad37f24c07]
Gostei + 0
13/09/2005
Mahdak
[]´s
Gostei + 0
13/09/2005
Michelli88
E tb... se vc clicar com botao direito na IBDataset, se nao me engano, a primeira ou segunda opçao do menu, eh para o updatesql... q eh onde eh gerado todos os inserts, todos os deletes etc... vc tem q gerar la novamente tb...
Para o segundo problema, tem a funçao copy no delphi que copia da string a partir da letra q vc definir, e a qtde de letras que vc definir... exemplo:[/color:f3efc3e7e1]
var palavra, resultado : string; begin palavra:= ´12345678´; resultado := Copy(palavra, 3, 4); ShowMessage(´resultado : ´+resultado ); end; A resposta sera: resultado : 3456
Ok? Espero q ajude!
Gostei + 0
15/09/2005
Mahdak
var palavra, resultado : string; begin palavra:= ´12345678´; resultado := Copy(palavra, 3, 4); ShowMessage(´resultado : ´+resultado ); end; A resposta sera: resultado : 3456
Ok, mi voce tem sido um anjo, pois esse problema que estou tendo é algo que tenho que resolver até sexta (amanha... uahuha) aqui no serviço...
bom em relação a possivel solução ao primeiro problema que voce me deu ela funcionou até certo ponto entao criei um novo IBDataSet só para isso e implementei esse código:
DM.qry_ArNovo.Close; DM.qry_ArNovo.SelectSQL.Clear; DM.qry_ArNovo.SelectSQL.add(´select CODIGO from AREA where NOME Like:Consulta ´); DM.qry_ArNovo.Params[0].AsString; DM.qry_ArNovo.ParamByName(´Consulta´).AsString:=´´+´¬´+combo_area.Text+´¬´; Dm.qry_ArNovo.open;
PORÉM, ele gera o seguinte erro:´qry_ArNovo: Field ´Nome´ not found´.
Sinto que estamos chegando a uma resolução para essa questão.
Já para o ´Copy´ capitei a idéia perfeitamente, porem quando tenho que passar isso de numeros para campos de tabela, nao consegui... se alguem puder me dar uma dica... o código que tenho que implementar o ´Copy´ está logo abaixo:
Escopo:
---------
Selecione (MAX(campo código até antes do ponto)+1 PROX da tabela Livros). // como dar um Copy para isso que quero???
// Contador de Código DM.qry_MatCod.Open; DM.qry_MatCod.SelectSQL.Clear; DM.qry_MatCod.SelectSQL.add(´SELECT (MAX(CODIGO) + 1 ) PROX FROM LIVROS ´); //acho que o copy iria aqui dm.qry_MatCod.open; cod := dm.qry_MatCod.fields[0].AsFloat; if cod = null then begin cod:=0; end else cod:=cod; DM.qry_MatCod.Close; Edit_Codigo.Text := FloatToStr(cod);
Gostei + 0
16/09/2005
Michelli88
O que é ´Nome´?
Tem no banco?? Se tiver confere la pra vc ver se escreveu certo...
Gostei + 0
16/09/2005
Michelli88
Heheh nao tinha visto:
´select CODIGO, NOME from AREA where NOME Like:Consulta
Gostei + 0
16/09/2005
Mahdak
Heheh nao tinha visto:
´select CODIGO, NOME from AREA where NOME Like:Consulta
ehehehehe, bahhh eu to regredindo mesmo neh.... ja to pirando o cabeção... brigado novamente Mi pela atenção esse problema ja era, agora só to no dilema do Copy...
Selecione (MAX(campo código até antes do ponto)+1 PROX da tabela Livros). // como dar um Copy para isso que quero???
Gostei + 0
16/09/2005
Michelli88
pq o seguinte, por exemplo:
Nao importa qual numero esteja do lado direito da virgula, se tiver la
102,1 102,9; 101,1; 100,9;
o numero 102 [b:918671ce5a]sempre vai ser o maior[/b:918671ce5a] antes da virgula!
Entao acho q vc pode pesquisar assim mesmo, e depois q encontrar ele vc tira a virgula e o q tiver depois da virgula!!!
Falow?!
Gostei + 0
16/09/2005
Mahdak
102,1 102,9; 101,1; 100,9;
desculpa Mi, me expressei mal... voce tem toda a razao, porem eu preciso saber o maior numero antes da virgula que tenha o numero da pesquisa do primeiro problema após a virgula, ou seja
lembra desse select? :
´select CODIGO, NOME from AREA where NOME Like:Consulta
ele é a chave da pesquisa... seria mais ou menos assim:
Select Max(codigo da tabela livros até antes da virgula, que tenha como numero após a virgula o CODIGO do select acima ) prox from livros
seria isso que eu gostaria de fazer....
Gostei + 0
16/09/2005
Michelli88
Entao vc vai pegar
SELECT * FROM tabela WHERE codigo LIKE PCodigo PCodigo:= Codigo+´¬´;
Gostei + 0
16/09/2005
Mahdak
SELECT * FROM tabela WHERE codigo LIKE PCodigo PCodigo:= Codigo+´¬´;
Ok, uaaaaaaaa!!!! estamos quase lá... ja consegui fazer essa naba funcionar, porem temos ainda um problema... ele está gerando o codigo antes do ponto, sem verificar o código após o ponto, sendo assim ele gera sempre a mesma sequencia, do tipo:
300.1
300.2
300.3
quando na verdade ele teria que seleciona o (maior numero que tiver depois do ponto ´Pcodigo´ +1) da tabela livros...
Veja abaixo:
var Cod : Double; begin // esse select seleciona o numero que vai após o ponto (o código da area escolhida) DM.qry_ArNovo.Close; DM.qry_ArNovo.SelectSQL.Clear; DM.qry_ArNovo.SelectSQL.add(´select * from AREA where NOME Like:Consulta ´); DM.qry_ArNovo.Params[0].AsString; DM.qry_ArNovo.ParamByName(´Consulta´).AsString:=´´+´¬´+combo_area.Text+´¬´; Dm.qry_ArNovo.open; // esse select seleciona o numero que vai antes do ponto DM.qry_MatCod.Open; DM.qry_MatCod.SelectSQL.Clear; DM.qry_MatCod.SelectSQL.add(´SELECT (MAX(CODIGO) + 1 ) PROX FROM LIVROS Where CODIGO Like:PCodigo ´); // seleciona o (maior numero que tiver depois do ponto "Pcodigo" +1) da tabela livros DM.qry_MatCod.Params[0].AsString; DM.qry_MatCod.ParamByName(´PCodigo´).AsString := ´¬´+DM.qry_ArNovoCODIGO.AsString; dm.qry_MatCod.open; cod := StrToFloat(FloatToStr(dm.qry_MatCod.fields[0].AsFloat)+´,´+FloatToStr(DM.qry_ArNovo.fields[0].AsFloat)); if cod = null then begin cod:=0; end else cod:=cod; DM.qry_MatCod.Close; Edit_Codigo.Text := FloatToStr(cod); end;
Falta pouco agora....
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)