Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
Ciabay
Contributor II
Contributor II

ERRO NO TRATAMENTO FATO - DUAS DIMENSOES COM MESMO CRITERIO

Boa tarde

Estou tratando de criar dois campos novos mais com um mesmo criterio con diferentes nomes:


A logica é,  se o segmento for 52 e a unidade de negocio 010 a unidade deve chamarse NEW HOLLAND e valor deve ser o 50% do valor total.

mesmo criterio deve ser aplicado mais a unidade deve chamarse CASE IH.

Assim o valor de Estoque que estava unificada na unidade 010 vai ser dividida em dois, uma chamada NEW HOLLAND e outra CASE.

Vai o tratamento=

/////UNIDADES

text (If(Match(zx7_segmen, '52')and( Match(zx7_unidad, '010')), 'UND NEW HOLLAND',

text (If(Match(zx7_segmen, '52')and( Match(zx7_unidad, '010')), 'UND CIH' , zx7_unidad )))) as FATO2_UNIDAD_Ajustada



Nesas duas dimensoes novas vou asignar 50% de um valor , para o resto das unidades se mantera o valor padrao:

///VALORES

If(FATO2_UNIDAD_Ajustada,'UND NEW HOLLAND', 'UND CIH'),(FATO2_Qtde * FATO2_PrecoMedio/2), FATO2_Qtde * FATO2_PrecoMedio as FATO_Valor2,

*O inconveniente que estou e nas UNIDADES, quando crio as UNIDADES so pega a primeira (NEW HOLLAND), se eu agrego algum segmento so pega a diferenca, entendo que nao seja permitido fazer isso, nem tenho certeza que seja uma boa pratica de tratamento

Agradeceria alguma ajuda de vcs.

Labels (4)
1 Solution

Accepted Solutions
felipedl
Partner - Specialist III
Partner - Specialist III

Nesse caso o meu script iria funcionar de acordo, visto que criei ambas as unidades, sem telas na tabela, somente pelos critérios que você passou, Seg = 52 e unidade 010.

A única coisa para melhorar o script, para deixa-lo mais dinâmico seria colocar em algum arquivo (txt ou planilha) as dimensões de como você pretende dividir seus segmentos/unidades.

Segue exemplo e arquivos:

TabelaTotal:

load

RowNo() as Id,

*;

Load * Inline

[

zx7_segmen,zx7_unidad,Valor

1,001,100

52,010,1000

51,010,440

];

left join (TabelaTotal)

LOAD Segmento as zx7_segmen,

     Unidade as zx7_unidad,

     [Nome Unidades]

FROM

(ooxml, embedded labels, table is Plan1);

TabelaRateio:

Load

*,

SubField([Nome Unidades],'|') as [Nome Unidade],

Valor/(SubStringCount([Nome Unidades],'|')+1) as [Valor Rateado]

Resident TabelaTotal; // Tabela que tem todos os seus dados

drop table TabelaTotal;

Sendo assim, se você colocar duas unidades no arquivo segmento, irá dividir o arquivo por dois, ou se forem 3, por três.

Fiz um exemplo de cada, dando o resultado:

sample.png

View solution in original post

3 Replies
felipedl
Partner - Specialist III
Partner - Specialist III

Olá Marco,

Pelo que entendi, você tem apenas a possível linha com Segmento = 52 e Unidade = 010 para então redistrubuir entre as dois nomes que você quer.

Do jeito que você colocou, eu faria o seguinte:

TabelaTotal:

load

RowNo() as Id,

*;

Load * Inline

[

zx7_segmen,zx7_unidad,Valor

1,001,100

52,010,200

52,010,44

];

Tabela_Seg52_Unid_010:

Load

*,

SubField([Nome Unidades],'|') as [Nome Unidade],

Valor/(SubStringCount([Nome Unidades],'|')+1) as [Valor Rateado];

Load

    *,

    'NEWHOLLAND|CASE IH' as [Nome Unidades]

Resident TabelaTotal // Tabela que tem todos os seus dados

where zx7_segmen='52' and zx7_unidad='010';

// Seleciona o resto dos seus dados

NoConcatenate

TabelaOutros:

Load

    *

Resident TabelaTotal // Tabela que tem todos os seus dados

where zx7_segmen<>'52' and zx7_unidad<>'010';

Concatenate(Tabela_Seg52_Unid_010)

Load

*

Resident TabelaOutros;

drop tables TabelaTotal,TabelaOutros;

Como resultado desse script, tem-se (fiz em View, mas da pra usar a mesma logica no Sense):

sample.png

A tabela da esquerda são os dados originais e a da direita as transformadas.

Nesse caso, as linhas com id 2 e 3 terão seus valores divididos igualmente pelo número de empresas no campo [Nome Unidades].

Espero que ajude,

Felipe.

Ciabay
Contributor II
Contributor II
Author

Boa tarde Felipe,

obrigado pela resposta.

Para aclarar, acho que e um pouco mais simples do que eu tentei explicar, a situacao e essa:

Vamos partir que uma UNIDADE e composta de SEGMENTOS.

Exemplos=
UNIDADE CSC  E COMPOSTA DE SEGMENTOS= 50,52,54,55

UNIDAD INSUMOS E COMPOSTA DE SEGMENTOS= 45.80.62

Tenho uma dimensao de unidade = UN CSC COMERCIAL COM a medida VALOR DE 1.000.000 US$

Essa dimensao debo dividirla pela metade em duas que UNIDADES que nao existem na tabela, SEMPRE QUE O SEGMENTO SEJA 52.


UN CSC NEW HOLLAND DEVE SER COMPOSTA POR SEGMENTO 52

UN CSC CASE DEVE SER COMPOSTA POR SEGMENTO 52

felipedl
Partner - Specialist III
Partner - Specialist III

Nesse caso o meu script iria funcionar de acordo, visto que criei ambas as unidades, sem telas na tabela, somente pelos critérios que você passou, Seg = 52 e unidade 010.

A única coisa para melhorar o script, para deixa-lo mais dinâmico seria colocar em algum arquivo (txt ou planilha) as dimensões de como você pretende dividir seus segmentos/unidades.

Segue exemplo e arquivos:

TabelaTotal:

load

RowNo() as Id,

*;

Load * Inline

[

zx7_segmen,zx7_unidad,Valor

1,001,100

52,010,1000

51,010,440

];

left join (TabelaTotal)

LOAD Segmento as zx7_segmen,

     Unidade as zx7_unidad,

     [Nome Unidades]

FROM

(ooxml, embedded labels, table is Plan1);

TabelaRateio:

Load

*,

SubField([Nome Unidades],'|') as [Nome Unidade],

Valor/(SubStringCount([Nome Unidades],'|')+1) as [Valor Rateado]

Resident TabelaTotal; // Tabela que tem todos os seus dados

drop table TabelaTotal;

Sendo assim, se você colocar duas unidades no arquivo segmento, irá dividir o arquivo por dois, ou se forem 3, por três.

Fiz um exemplo de cada, dando o resultado:

sample.png