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;
ERRO AO COMPILAR UMA POST-QUERY
-
- 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?
Agradeço desde já.
-
- Rank: DBA Júnior
- Mensagens: 229
- Registrado em: Sex, 05 Set 2008 2:59 pm
- Localização: Igrejinha - RS
Usa LPAD.
LPAD(campo, 10, 0)
-
- Rank: DBA Júnior
- Mensagens: 229
- Registrado em: Sex, 05 Set 2008 2:59 pm
- Localização: Igrejinha - RS
Posta todo o código ai, por favor.
-
- Rank: DBA Júnior
- Mensagens: 229
- Registrado em: Sex, 05 Set 2008 2:59 pm
- Localização: Igrejinha - RS
SELECT LPAD(campo, 10, 0)
INTO campo
FROM dual;
-
- 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
Programador Junior
Parobé RS
[]s
Este seu codigo esta bastante estranho.
Qual o objetivo de você usar algo como isso:
Além disso você esta atribuindo char para number.
Use algo assim:
Para este codigo funcionar certifique-se que seu campo é do tipo number
Qual o objetivo de você usar algo como isso:
'V_TESTE:'|| TO_CHAR(V_TESTE,'0000000000');
Use algo assim:
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;
-
- 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.
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.
IF
SELECT LPAD(campo, 10, 0)
INTO campo
FROM dual;
END IF;
END;
-
- 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
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.
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.
-
- Rank: DBA Júnior
- Mensagens: 229
- Registrado em: Sex, 05 Set 2008 2:59 pm
- Localização: Igrejinha - RS
O teu IF não tem condição?
-
- 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:
Ao compilar aparece a mensagem:
O campo é do tipo datatype = number, maximun lenght 10,
Fiz o select que você sugeriu mas deu erro eu alterei ele desta forma:
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;
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
-
- 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
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
E length esta escrito errado é LENGTH
-
- 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
Ao compilar aparece a mensagem:
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;
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
-
- 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
Programador Junior
Parobé RS
[]s
Isso:
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;
-
- 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:
você tem idéia do que pode ser agora?
error 307 at 5, column 12
too many declarations of 'to_char' match this call
error 0 at line 5, column2
statement ignored.
-
- Rank: Programador Pleno
- Mensagens: 36
- Registrado em: Seg, 17 Ago 2009 11:02 am
- Localização: Gaspar-SC
Jeziel Peres
PL/SQL - Forms 6i
PL/SQL - Forms 6i
cara usa LPAD que funciona....
como o Diego_Mello informo você pode usar:
mais posta aqui no forum o teu codigo atual...
vê se funciona...
como o Diego_Mello informo você pode usar:
SELECT LPAD(campo, 10, 0)
INTO campo
FROM dual;
vê se funciona...
-
- Rank: Programador Pleno
- Mensagens: 37
- Registrado em: Seg, 10 Ago 2009 3:15 pm
- Localização: São Paulo - SP
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;
-
- 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
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.
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.
-
- Rank: Programador Pleno
- Mensagens: 36
- Registrado em: Seg, 17 Ago 2009 11:02 am
- Localização: Gaspar-SC
Jeziel Peres
PL/SQL - Forms 6i
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.
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.
-
- 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
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.
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.
-
- 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...
A formatação do campo tem de ser em tempo de execução...
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;
-
- Informação
-
Quem está online
Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes