12 Replies Latest reply: Aug 30, 2017 7:34 AM by Cesar Prado RSS

    Existe limite comando IF no subfield ?

    Cesar Prado

      estou criando esta tabela abaixo mas não esta mais aceitando o comando IF ?

        • Re: Existe limite comando IF no subfield ?
          Clever Anjos

          Sim, existe.

          Você não pode ter mais que 100 níveis de aninhamento de If´s

           

          A solução de contorno para você é

           

          Mapa:

          mapping load * inline [

               De, Para

          1025, RTB

          1020, DTH

          // cadastre todas as transformacoes

          ];

           

           

          LOAD

               ApplyMap('Mapa',SubField(BASE, '-', 2)) as PRODUTO

          • Re: Existe limite comando IF no subfield ?
            MARIO SOARES

            Amigo,

            Recomendo por conta de performance, manutenção e boa prática utilizar Mapping;

             

            Exemplo:

             

            Map_Base1:
            Mapping Load *
            Inine [
                 De, Para
                 23602,'RTB',
                 30202,'RTB'
            ];
            
            Map_Base2:
            Mapping Load *
            Inine [
                 De, Para
                 1020, 'DTH',
                 1021, 'DG',
                 1023, 'LPDADOS',
                 1024, 'ADSL',
                 1013, 'ESSE',
                 1014, 'ESSE',
                 1015, 'DTX'
            ];
            
            Tab_Exemplo:
            Load
                 ApplyMap('Map_Base1', SubField(BASE, '-', 1), ApplyMap('Map_Base2', SubField(BASE, '-', 2), 'Não definido')) As 'PRODUTO',
                 ...
            From ...;
            

             

            Abraço.

             

            Fonte: Mapping ‒ QlikView

              • Re: Existe limite comando IF no subfield ?
                MARIO SOARES

                Amigo;

                Opa, eu tinha escrito rápido, é Inline mesmo;

                 

                Referente ao erro, é porque você deve ajustar o meu exemplo,

                Remova o "..." depois da linha do "ApplyMap" e substitua para os seus campos e a linha do "From ..." também deve ser substituído para a origem correta do seu modelo;

                Eu apenas fiz um exemplo de como poderá utilizar o Mapping para substituir os Ifs...

                Complete o exemplo da estrutura Map_Base1 e Map_Base2 com as demais condições, repare que deixei separado Map_Base1 para os campos pertinentes aos SubField(BASE, '-', 1) e Map_Base2 para os SubField(BASE, '-', 2) dos seus Ifs()...

                 

                Tab_Exemplo: 
                Load 
                    ApplyMap('Map_Base1', SubField(BASE, '-', 1), ApplyMap('Map_Base2', SubField(BASE, '-', 2), 'Não definido')) As 'PRODUTO', 
                    ...  <<<< Erro do script*
                From ...;  <<<< Erro do script*
                


                *deixei como exemplo


                Abraço amigo.

                  • Re: Existe limite comando IF no subfield ?
                    Cesar Prado

                    Desculpa mas vc poderia me dar um exemplo com o FROM junto ? Como seria a linha de comando completa ?

                      • Re: Existe limite comando IF no subfield ?
                        MARIO SOARES

                        Amigo, o From é simplesmente aonde vai buscar a tabela com os dados;

                         

                        Exemplo:

                        Tab_teste:
                        Load
                                 Campo1
                            ,    Campo2
                            ,    ApplyMap('Map_Base1', SubField(BASE, '-', 1), ApplyMap('Map_Base2', SubField(BASE, '-', 2), 'Não definido')) As 'PRODUTO'
                        FROM [c:\pasta\arquivo.qvd](qvd); //endereço da tabela
                        
                        

                         

                        Dependendo de como está o seu modelo, pode varia o método;

                        Outros exemplos:

                        Tab1:
                        LOAD * from 'c:\userfiles\data2.txt' (ansi, txt, delimiter is '\t', embedded labels);
                        
                        
                        Tab2:
                        SELECT A,B,C,D from transtable;
                        
                        
                        Tab3:
                        LOAD A,B,month(C),A*B+D as E resident Tab2;
                        
                        

                         

                        Percebi que você editou a sua pergunta e removeu a sua amostra que tinha o nome dos campos (Recordo que tinha o campo BASE).

                         

                        Mas a proposta inicial da pergunta antes da sua edição era de resolver a questão dos 100 IFs... E a proposta para o seu caso foi de utilizar Mapping.

                         

                        Abraço.

                         

                        Observe:

                        Load ‒ QlikView

                        Mapping ‒ QlikView

                          • Re: Existe limite comando IF no subfield ?
                            MARIO SOARES

                            O que tem depois desta estrutura?

                            Do Load até o ";"

                              • Re: Existe limite comando IF no subfield ?
                                MARIO SOARES

                                Amigo, após a última linha, imagino que deva ter um From ou Resident... Está faltando o depois...

                                É importante sabe como funciona a estrutura do Load, e para substituir os IFs no seu caso, a estrutura do Mapping;

                                Exemplo:

                                 

                                EXEMPLO_Map_Base1:  // EXEMPLO DE MAPPING PARA O DE-PARA
                                Mapping Load * 
                                Inline [  // <<<<< COMPLETE A LISTA ABAIXO PARA AS CONDIÇÕES DO IF PARA SubField(BASE, '-', 1)
                                    De, Para 
                                    23602,'RTB', 
                                    30202,'RTB' 
                                ]; 
                                
                                EXEMPLO_Map_Base2:  // EXEMPLO DE MAPPING PARA O DE-PARA
                                Mapping Load * 
                                Inline [  // <<<<< COMPLETE A LISTA ABAIXO PARA AS CONDIÇÕES DO IF PARA SubField(BASE, '-', 2)
                                    De, Para 
                                    1020, 'DTH', 
                                    1021, 'DG', 
                                    1023, 'LPDADOS', 
                                    1024, 'ADSL', 
                                    1013, 'ESSE', 
                                    1014, 'ESSE', 
                                    1015, 'DTX' 
                                ]; 
                                
                                EXEMPLO_TABELA:
                                Load
                                    ,    EXEMPLO_CAMPO1 //SUBSTITUA
                                    ,    EXEMPLO_CAMPO2 //SUBSTITUA
                                    ,    ApplyMap('EXEMPLO_Map_Base1', SubField(BASE, '-', 1), ApplyMap('EXEMPLO_Map_Base2', SubField(BASE, '-', 2), 'Não definido')) As 'PRODUTO' // ESTA LINHA É PARA SUBSTITUIR OS IFs()
                                From [EXEMPLO_ENDEREÇO_DA_SUA_TABELA_AQUI/EXEMPLO_ARQUIVO.qvd](qvd);
                                


                                Amigo, acho que você está com problemas rsrs, de uma olhada nas fontes abaixo para entender como funciona:

                                Load ‒ QlikView

                                Mapping ‒ QlikView

                                 

                                Abraço.

                                  • Re: Existe limite comando IF no subfield ?
                                    Cesar Prado

                                    EXEMPLO_Map_Base1:

                                    Mapping Load *  

                                    Inline

                                        

                                    Map_Base: 

                                    Mapping Load *  

                                    Inline [ 

                                        De, Para  

                                        1020, 'DTH',  

                                        1021, 'DG',  

                                        1023, 'LPDADOS',  

                                        1024, 'ADSL',  

                                        1013, 'ESSE',  

                                        1014, 'ESSE',  

                                        1015, 'DTX'  

                                    ];  

                                     

                                    EXEMPLO_TABELA: 

                                    Load 

                                        ,    EXEMPLO_CAMPO1 //SUBSTITUA  "***** PODE ME DAR UM EXEMPLO DESTE PONTO PARA BAIXO AQUI ????"

                                        ,    EXEMPLO_CAMPO2 //SUBSTITUA 

                                        ,    ApplyMap('EXEMPLO_Map_Base1', SubField(BASE, '-', 1), ApplyMap('EXEMPLO_Map_Base2', SubField(BASE, '-', 2), 'Não definido')) As 'PRODUTO' // ESTA LINHA É PARA SUBSTITUIR OS IFs() 

                                    From [EXEMPLO_ENDEREÇO_DA_SUA_TABELA_AQUI/EXEMPLO_ARQUIVO.qvd](qvd);

                        • Re: Existe limite comando IF no subfield ?
                          Eduardo DImperio

                          Concordo com o Cleaver e esse é sem duvida a maior quantidades de ifs que eu ja vi.

                          Não é possivel criar uma tabela de DePara e trocar tudo pra uma linha de comando?