Fórum Select (Duas duvidas) #295229

12/09/2005

0

Salve galera do clube.... bom estou com um probleminha aqui pra ver quem consegue me dar uma luz....

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

Mahdak

Responder

Posts

12/09/2005

Mahdak

só pra completar, refiz o ´Primeiro problema´ e tambem vou postar aqui o Erro gerado pelo sistema:
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);



Responder

Gostei + 0

13/09/2005

Ehvasc

vc adicionou o campo no filedEditor da query?


Responder

Gostei + 0

13/09/2005

Michelli88

[size=16:ad37f24c07][color=green:ad37f24c07]Seguinte, atualmente trabalho com mySql e SqlServer..
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]


Responder

Gostei + 0

13/09/2005

Mahdak

Ok Mi, ja apaguei tudo dos FieldEditors dos meus TIBDataSet´s... mas ainda nao resolveu o ´Primeiro problema´... e sobre o ´Segundo Problema´, alguem teria alguma idéia?

[]´s


Responder

Gostei + 0

13/09/2005

Michelli88

[color=green:f3efc3e7e1]hii esse negocio eh chatinho mesmo, tenta novamente, desconecta o database e conecta novamente, confere pra ver se veio o tipo certo mesmo... Em ultimo caso, cria uma IBDataset nova...

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!


Responder

Gostei + 0

15/09/2005

Mahdak

[color=green:dc3cd379cf]hii esse negocio eh chatinho mesmo, tenta novamente, desconecta o database e conecta novamente, confere pra ver se veio o tipo certo mesmo... Em ultimo caso, cria uma IBDataset nova... 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:dc3cd379cf]
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!



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);



Responder

Gostei + 0

16/09/2005

Michelli88

PORÉM, ele gera o seguinte erro:´qry_ArNovo: Field ´Nome´ not found´.


O que é ´Nome´?
Tem no banco?? Se tiver confere la pra vc ver se escreveu certo...


Responder

Gostei + 0

16/09/2005

Michelli88

´select CODIGO from AREA where NOME Like:Consulta ´);


Heheh nao tinha visto:

´select CODIGO, NOME  from AREA where NOME Like:Consulta



Responder

Gostei + 0

16/09/2005

Mahdak

[quote:306e6085e8]´select CODIGO from AREA where NOME Like:Consulta ´);


Heheh nao tinha visto:

´select CODIGO, NOME  from AREA where NOME Like:Consulta
[/quote:306e6085e8]

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??? 



Responder

Gostei + 0

16/09/2005

Michelli88

Eu acho o seguinte, que vc nao precisa tirar os numeros apos a virgula,
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?!


Responder

Gostei + 0

16/09/2005

Mahdak

Eu acho o seguinte, que vc nao precisa tirar os numeros apos a virgula, 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:a682b55765]sempre vai ser o maior[/b:a682b55765] 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?!




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....


Responder

Gostei + 0

16/09/2005

Michelli88

Ah sim... entendi...

Entao vc vai pegar

SELECT *
FROM  tabela
WHERE 
   codigo LIKE PCodigo


PCodigo:= Codigo+´¬´;



Responder

Gostei + 0

16/09/2005

Mahdak

Ah sim... entendi... Entao vc vai pegar
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....


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar