ERRO AO COMPILAR UMA POST-QUERY

Dicas do Oracle Forms Builder - Blocos, Itens, LOV, Canvas, Triggers, comandos, PLL, d2kwutil, FMB, Alert, menus, etc
Responder
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

Pessoal tenho que tratar um campo de um forms quando o conteúdo desse campo for menor que 10 posições ele deve ser preenchido com 0 a esquerda, caso o valor contenha 10 ou mais posições ele deve ser exibido sem a mascara, fiz o codigo abaixo mas está dando erro, alguém poderia me ajudar?

Selecionar tudo

DECLARE
  V_TESTE NUMBER(10) := NOME_FORMS.NOME_CAMPO;
BEGIN
  IF LENGHT(V_TESTE) < 10 THEN
     ('V_TESTE:'||TO_CHAR(V_TESTE,'0000000000'));
  ELSE
     ('V_TESTE: '||TO_CHAR(V_TESTE));
  END IF;
END;
Agradeço desde já.
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Usa LPAD.

Selecionar tudo

LPAD(campo, 10, 0)
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

não adiantou, continua dando erro, no código que eu postei aqui a mensagem de erro é: Error 103 at line 5, column 6.

se alguém pode me ajudar eu agradeço.
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Posta todo o código ai, por favor.
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

este é o codigo todo, é uma post-query a nivel do data block.
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Selecionar tudo

SELECT LPAD(campo, 10, 0)
    INTO campo
   FROM dual;
Deve funcionar.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Este seu codigo esta bastante estranho.

Qual o objetivo de você usar algo como isso:

Selecionar tudo

'V_TESTE:'|| TO_CHAR(V_TESTE,'0000000000');
Além disso você esta atribuindo char para number.

Use algo assim:

Selecionar tudo

DECLARE 
V_TESTE VARCHAR2(10) := TO_CHAR(NOME_FORMS.NOME_CAMPO); 
BEGIN 
IF LENGHT(V_TESTE) < 10 THEN 
 V_TESTE := TO_CHAR(LPAD(NOME_FORMS.NOME_CAMPO,10,'0')); 
END IF; 
END; 
Para este codigo funcionar certifique-se que seu campo é do tipo number
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

Não rolou, eu tentei montar o select desta forma mas não sei se está certo.

Selecionar tudo

IF 
SELECT LPAD(campo, 10, 0) 
    INTO campo 
   FROM dual;
END IF; 
END; 
mas eu acho que com o lpad não vai rolar porque ele tem de ler a quantidade de caracteres do campo e tratar apenas se este campo tiver mais de 10 caracteres, e o forms é um base table.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Cara o lpad vai resolver seu problema para resolver os zeros a esquerda,
a condição você vai montar independente dele.

Use o lenght para condição como você estava fzndo antes, e o lpad para concatenar os zeros a esquerda.
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

O teu IF não tem condição? :shock:
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

Sérgio,
O campo é do tipo datatype = number, maximun lenght 10,

Fiz o select que você sugeriu mas deu erro eu alterei ele desta forma:

Selecionar tudo

DECLARE 
V_TESTE VARCHAR2(10) := TO_CHAR(NOME_DATABLOCK.NOME_CAMPO); 
BEGIN 
IF LENGHT(V_IATA) < 7 THEN 
 V_TESTE := TO_CHAR(LPAD(NOME_DATABLOCK.NOME_CAMPO,10,'0')); 
END IF; 
END; 
Ao compilar aparece a mensagem:

Selecionar tudo

error 201 at line2, column 31
identifier 'NOME_DATABLOCK.NOME_CAMPO' must be declared
error 201 at line2, column 8
iten ignored
error 201 at line4, column 4
identifier 'LENGHT'must declared
error 0 at line4, column 1
iten ignored
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

NOME_DATABLOCK.NOME_CAMPO = Você tem que substituir pelo nome do seu datablock e pelo nome do seu campo e colocar dois pontos na frente.

E length esta escrito errado é LENGTH
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

Sergio, retificando o código ficou assim!! mas continua o erro

Selecionar tudo

DECLARE 
V_TESTE VARCHAR2(10) := TO_CHAR(NOME_DATABLOCK.NOME_CAMPO); 
BEGIN 
IF LENGHT(V_TESTE) < 10 THEN 
V_TESTE := TO_CHAR(LPAD(NOME_DATABLOCK.NOME_CAMPO,10,'0')); 
END IF; 
END; 
Ao compilar aparece a mensagem:

Selecionar tudo

error 201 at line2, column 31 
identifier 'NOME_DATABLOCK.NOME_CAMPO' must be declared 
error 201 at line2, column 8 
iten ignored 
error 201 at line4, column 4 
identifier 'LENGHT'must declared 
error 0 at line4, column 1 
iten ignored  
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Isso:

Selecionar tudo

DECLARE 
V_TESTE VARCHAR2(10) := TO_CHAR(:NOME_DATABLOCK.NOME_CAMPO); 
BEGIN 
IF LENGTH(V_TESTE) < 10 THEN 
V_TESTE := TO_CHAR(LPAD(:NOME_DATABLOCK.NOME_CAMPO,10,'0')); 
END IF; 
END;
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

Sérgio o meu código está da mesma forma que você sugeriu e ao compilar o forms está dando este erro:

Selecionar tudo

error 307 at 5, column 12
too many declarations of 'to_char' match this call
error 0 at line 5, column2
statement ignored.
você tem idéia do que pode ser agora?
Jezper
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Seg, 17 Ago 2009 11:02 am
Localização: Gaspar-SC
Jeziel Peres

PL/SQL - Forms 6i

cara usa LPAD que funciona....

como o Diego_Mello informo você pode usar:

Selecionar tudo

SELECT LPAD(campo, 10, 0) 
    INTO campo 
   FROM dual;
mais posta aqui no forum o teu codigo atual...

vê se funciona...
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

Selecionar tudo

DECLARE 
V_TESTE VARCHAR2(10) := TO_CHAR(:NOME_BLOCO.NOME_CAMPO); 
BEGIN 
IF LENGTH(V_TESTE) < 10 THEN 
 V_TESTE := TO_CHAR(LPAD(::NOME_BLOCO.NOME_CAMPO,10,'0')); 
END IF; 
END; 
Esse é o codigo atual, ao compilar ele está dando o erro que mencionei.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Você ta fazendo um to_char de um campo que já é char.

Ou o campo em que você esta aplicando o primeiro to_char é caratcer ou retire o to_char da frente do lpad.

No banco aqui funcionou o to_char seguido do lpad, mas não cheguei a testar no forms.
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

O campo é data type Number, maximum length 9. No banco funciona no forms ele da pau......
Jezper
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Seg, 17 Ago 2009 11:02 am
Localização: Gaspar-SC
Jeziel Peres

PL/SQL - Forms 6i

como o SergioLBJr disse já é um char...

no meu banco foi.... unica solução aparentemente visivel é retirar o to_char da frente do LPAD.

se não for isso me desculpe cara mais dai eu não sei o motivo desse erro...

abraço.
Jezper
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Seg, 17 Ago 2009 11:02 am
Localização: Gaspar-SC
Jeziel Peres

PL/SQL - Forms 6i

aumenta o tamanho dele... pois acho q você ta dando um paramento maior doque a capacidade do campo...
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Só complementando.

Pelo a definição do seu problema, o que você esta fazendo esta no minimo errado.

Você quer testar se eu campo é menor que 10, sendo que o maximum length dele é 9??? (pra que testar então)????

E se for maior que 10 ele não executa a condição e retira a mascara???? (Cara, se teu campo for maior que dez??? no forms isso não vai acontecer já que você não vai conseguir digitar mais do que 9, e se vier um valor do banco com mais de 10 dos dois um, ou vai dar erro ou vai cortar este teu valor.

Minha sugestão é que você revise todo o seu conceito antes de começar o seu forms, pois esta com algumas inconsistencias bem graves.
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

Então se eu tirar o to_char da frente do lpad ele compila, mas não trata o campo.
Jezper
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Seg, 17 Ago 2009 11:02 am
Localização: Gaspar-SC
Jeziel Peres

PL/SQL - Forms 6i

cmo o SergioLBJr disse seria bom você refer oque você quer fazer, pois não tem sentido...

apenas uma sugestão!!!!
ceess_1
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 37
Registrado em: Seg, 10 Ago 2009 3:15 pm
Localização: São Paulo - SP

Obrigado a todos que me ajudaram, consegui resolver de outra forma, segue abaixo o código alterado para ficar como ajuda para quem precisar.
A formatação do campo tem de ser em tempo de execução...

Selecionar tudo

BEGIN 
IF LENGTH(:nome_bloco.nome_campo) < 10 THEN 
   set_item_property('nome_bloco.nome_campo',FORMAT_MASK,'0000000000');
ELSE
	 set_item_property('nome_bloco.nome_campo',FORMAT_MASK,'');
END IF; 
END;
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes