Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Boa tarde,
Minha dúvida é o seguinte... Tenho 2 tabelas onde a única ligação entre elas é a conta. Uma tabela é a própria tabela de cadastro de contas, onde as contas possuem 9 caracteres, a outra tabela é uma tabela com descrição de níveis, onde as contas aparacem "incompletas" , por exemplo '311' = todas as contas que começam com 311... ou 42101 ....mostra sempre os primeiros dígitos, mas não tem um número certo de caracteres.
Alguém tem alguma ideia de como posso ligar essas 2 tabelas?
try this
// join the 2 tables to generate all combinations
Conta:
LOAD * INLINE [
CONTA
555123
555000
400100
300222
500222
111222
];
Join (Conta)
LOAD * INLINE [
NIVEL, CONTA2
1,555
2,5550
3,40
4,300
5,5
6,111
];
// wildmatch to get the possible join
Tmp:
load
CONTA, CONTA2,
NIVEL, len(CONTA2) as LEN,
if(WildMatch(CONTA, CONTA2 & '*'), 1, 0) as Flag
Resident Conta
where WildMatch(CONTA, CONTA2 & '*');
DROP Table Conta;
//
// if there are more than 1 possible join between the 2 tables I choose the longest (LEN desc)
//
Table:
NoConcatenate load * Resident Tmp where peek(CONTA) <> CONTA order by CONTA, LEN desc;
DROP Table Tmp;
Rodrigo,
Acredito que primeiro vc deve entender qual a regra..
Vc vai montar a chave pelo 4 ou N primeiros dígitos? Porque a diferença de qtde de carácter é simples, pois pode ser completada por zero ou outro carácter.
Então , não sei se expliquei direito...
mas é algo tipo, na tabela de níveis eu tenho :
nível conta
1 311
2 42101
(que representa todas as contas que começam com esses números, não tem uma quantidade de caracteres certos)
dai no cadastro de conta eu tenho la:
311010101
311010102
311010202
421010101
421020102
onde eu quero chegar :
nivel conta
1 311010101
1 311010102
1 311010202
2 421010101
2 421020102
é possível?
Fiz aqui, mas estou achando a minha solução um pouco burra (para as 18h é o melhor que temos rsrsrs).
try this
// join the 2 tables to generate all combinations
Conta:
LOAD * INLINE [
CONTA
555123
555000
400100
300222
500222
111222
];
Join (Conta)
LOAD * INLINE [
NIVEL, CONTA2
1,555
2,5550
3,40
4,300
5,5
6,111
];
// wildmatch to get the possible join
Tmp:
load
CONTA, CONTA2,
NIVEL, len(CONTA2) as LEN,
if(WildMatch(CONTA, CONTA2 & '*'), 1, 0) as Flag
Resident Conta
where WildMatch(CONTA, CONTA2 & '*');
DROP Table Conta;
//
// if there are more than 1 possible join between the 2 tables I choose the longest (LEN desc)
//
Table:
NoConcatenate load * Resident Tmp where peek(CONTA) <> CONTA order by CONTA, LEN desc;
DROP Table Tmp;
Cria as regras ao nivel da BD e não no Edit Script.
Podes até criar Views para simular o que pretendes.
Seguramente terás menos problemas com joins, tabelas INLINE, etc dentro do QVD.
Yuri , tinha pensado nisso no início também , mas achei que deveria ter algo mais simples, por isso postei aqui.
Massimo, era isso mesmo! O wildmatch era o que eu precisava.
Antonio, a tabela de níveis que eu tenho vem de planilha, tem que ser feito no Edit Script mesmo.
Obrigado pela ajuda pessoal!
E os dados que existem no Excel não estão na Base de Dados?
Não Antonio, são níveis(agrupamentos) específicos criados pela área, baseado em certas contas, não tem nenhum registro no sistema
ok.
Nesse caso não têm outra solução.
Abr