GARANTIR DESCONTO

Fórum Coluna Dinâmica #453665

30/08/2013

0

Olá, a uns dias comecei a criar uma procedure que precisa criar colunas de forma dinâmica para que eu jogue para um datagrid do C#, porém, para o Oracle 10G não achei nada parecido com um Pivot Dinâmico, tentei fazer uma proc, ela até chega a criar as colunas, porém, tem um bug que ele pega o valor da primeira linha e replica em todas outras, segue para analise de vocês, se alguém poder me ajudar, serei muito grato.



PROCEDURE PRC_TESTE_RELATORIO(P_COD_LOJA IN NUMBER,
                                      P_COD_PRDUTO IN NUMBER,
                                      P_DMNSAO_TEMPO_INI IN DATE,
                                      P_DMNSAO_TEMPO_FIM IN DATE,
                                      I_CURSOR OUT T_CURSOR)

AS
V_CURSOR T_CURSOR;
V_LENGTH NUMBER;
V_SQL LONG;
CURSOR C1 IS
       SELECT COD_LOJA AS LOJA,
              COD_PRDUTO AS PRODUTO,
              to_char(to_date(COD_DMNSAO_TEMPO, 'rrrrmmdd'), 'DD/MM/RRRR') AS DATA,
              QTD_VENDA
       FROM   B_PRVSAO_VENDA_PRJTDO
       WHERE  COD_LOJA = P_COD_LOJA
       AND    COD_PRDUTO = P_COD_PRDUTO
       AND COD_DMNSAO_TEMPO >= TO_CHAR(TO_DATE(P_DMNSAO_TEMPO_INI, 'DD/MM/RRRR'),'RRRRMMDD')
       AND COD_DMNSAO_TEMPO <= TO_CHAR(TO_DATE(P_DMNSAO_TEMPO_FIM, 'DD/MM/RRRR'),'RRRRMMDD');

begin

V_SQL := 'SELECT DISTINCT A.COD_LOJA,
       A.NOM_LOJA,
       B.DSC_PROD,';
       FOR R1 IN C1 LOOP
         V_SQL := V_SQL || R1.QTD_VENDA || ' as ' || '"' || R1.DATA || '"' ||',';
       END LOOP;
       V_LENGTH := LENGTH(V_SQL);
       V_SQL := SUBSTR(V_SQL, 0, V_LENGTH -1);
V_SQL := V_SQL || ' FROM   I_LOJA A,
       I_PRODUT B,
       B_PRVSAO_VENDA_PRJTDO C
WHERE  C.COD_LOJA = A.COD_LOJA
AND C.COD_PRDUTO = B.COD_PROD
AND A.COD_LOJA = DECODE('||P_COD_LOJA||', -1, A.COD_LOJA, '||P_COD_LOJA||')
AND B.COD_PROD = DECODE('||P_COD_PRDUTO||', -1, B.COD_PROD, '||P_COD_PRDUTO||')
AND C.COD_DMNSAO_TEMPO >= TO_CHAR(TO_DATE('''||P_DMNSAO_TEMPO_INI||''', ''DD/MM/RRRR''),''RRRRMMDD'')
AND C.COD_DMNSAO_TEMPO <= TO_CHAR(TO_DATE('''||P_DMNSAO_TEMPO_FIM||''', ''DD/MM/RRRR''),''RRRRMMDD'')';

 OPEN V_CURSOR FOR V_SQL;

 I_CURSOR := V_CURSOR;

        EXCEPTION
          WHEN OTHERS THEN
            RAISE_APPLICATION_ERROR(-20000, 'SP_RT_OCORRENCIAS: ' || SQLERRM);

end PRC_TESTE_RELATORIO;
Guilherme Silva

Guilherme Silva

Responder

Posts

03/09/2013

Guilherme Silva

Solução para pivot em oracle 10g

PROCEDURE SP_SE_PRVSAO_15_DIAS(P_COD_LOJA IN NUMBER,
                                P_COD_PRDUTO IN NUMBER,
                                P_COD_SETOR IN NUMBER,
                                P_COD_GRUPO IN NUMBER,
                                P_DATA_INI IN DATE,
                                P_DATA_FIM IN DATE,
                                V_BLOB OUT BLOB)

AS
V_XML VARCHAR2(32767);
V_COD_LOJA I_LOJA.COD_LOJA%TYPE;
V_COD_PRDUTO I_PRODUT.COD_PROD%TYPE;
V_COD_SETOR VW_SETOR.COD_SETOR%TYPE;
V_COD_GRUPO VW_GRUPO.COD_GRUPO%TYPE;
V_COD_DMNSAO_TEMPO DATE;
V_CLOB CLOB;
V_DATA_HEADER VARCHAR2(10);

begin
V_XML := '<ROW>';
V_CLOB := '<PRVSAO_VENDAS>';
V_COD_LOJA := -1;
V_COD_PRDUTO := -1;
V_COD_SETOR := -1;
V_COD_GRUPO := -1;
V_COD_DMNSAO_TEMPO := '01/01/1970';
FOR R1 IN (SELECT B.COD_SETOR, 
       C.COD_GRUPO, 
       A.COD_LOJA,
       C.NOM_LOJA,
       A.COD_PRDUTO,
       C.DSC_PRDUTO,
       B.COD_SISTMT,
       A.QTD_VENDA,
       TO_CHAR(TO_DATE(A.COD_DMNSAO_TEMPO,'RRRRMMDD'),'DD/MM/RRRR') AS COD_DMNSAO_TEMPO
FROM B_PRVSAO_VENDA_PRJTDO A,
     B_LOJA_PRDUTO_FORNEC B,
     D_DMNSAO_LOJA_PRDUTO C
WHERE A.COD_LOJA    = B.COD_LOJA
AND   A.COD_PRDUTO  = B.COD_PRDUTO
AND   B.COD_LOJA    = C.COD_LOJA
AND   B.COD_PRDUTO  = C.COD_PRDUTO
AND   C.COD_GRUPO   = DECODE(P_COD_GRUPO, -1, C.COD_GRUPO, P_COD_GRUPO)
AND   B.COD_SETOR   = DECODE(P_COD_SETOR, -1, B.COD_SETOR, P_COD_SETOR)
AND   B.COD_LOJA    = DECODE(P_COD_LOJA, -1,  B.COD_LOJA, P_COD_LOJA)
AND   B.COD_PRDUTO  = DECODE(P_COD_PRDUTO, -1, B.COD_PRDUTO, P_COD_PRDUTO)
AND   A.COD_DMNSAO_TEMPO >= TO_CHAR(TO_DATE(P_DATA_INI, 'DD/MM/RRRR'),'RRRRMMDD')
AND   A.COD_DMNSAO_TEMPO <= TO_CHAR(TO_DATE(P_DATA_FIM, 'DD/MM/RRRR'),'RRRRMMDD')
ORDER BY B.COD_SETOR, C.COD_GRUPO, A.COD_LOJA, A.COD_PRDUTO, COD_DMNSAO_TEMPO) LOOP

   IF R1.COD_LOJA = V_COD_LOJA 
     AND R1.COD_PRDUTO = V_COD_PRDUTO 
     AND R1.COD_SETOR = V_COD_SETOR 
     AND R1.COD_GRUPO = V_COD_GRUPO
     AND R1.COD_DMNSAO_TEMPO <> V_COD_DMNSAO_TEMPO THEN
     V_COD_DMNSAO_TEMPO := R1.COD_DMNSAO_TEMPO;
     V_DATA_HEADER := TO_CHAR(V_COD_DMNSAO_TEMPO, 'DDMMRRRR');     
         V_XML := V_XML || '<D'||V_DATA_HEADER||'>'||R1.QTD_VENDA||'</D'||V_DATA_HEADER||'>';
   
   ELSE 
     
           IF V_XML <> '<ROW>' then
              
              V_XML := V_XML || ' </ROW>';
              V_CLOB := V_CLOB || V_XML;
              V_XML := '<ROW>';
              
           END IF;
           
           V_COD_LOJA := R1.COD_LOJA;
           V_COD_PRDUTO := R1.COD_PRDUTO;
           V_COD_SETOR := R1.COD_SETOR;
           V_COD_GRUPO := R1.COD_GRUPO;
           V_COD_DMNSAO_TEMPO := R1.COD_DMNSAO_TEMPO;
           V_DATA_HEADER := TO_CHAR(V_COD_DMNSAO_TEMPO, 'DDMMRRRR');   
           V_XML := V_XML || '<COD_LOJA>'||V_COD_LOJA||'</COD_LOJA>';
           V_XML := V_XML || '<COD_PRDUTO>'||V_COD_PRDUTO||'</COD_PRDUTO>';
           V_XML := V_XML || '<COD_SETOR>'||V_COD_SETOR||'</COD_SETOR>';
           V_XML := V_XML || '<COD_GRUPO>'||V_COD_GRUPO||'</COD_GRUPO>';
           V_XML := V_XML || '<D'||V_DATA_HEADER||'>'||R1.QTD_VENDA||'</D'||V_DATA_HEADER||'>';
   
   END IF;

END LOOP;
V_CLOB := V_CLOB || '</PRVSAO_VENDAS>';
V_BLOB := FC_SE_CONVERT_CLOB_BLOB(V_CLOB);
        EXCEPTION
        WHEN NO_DATA_FOUND THEN
            RAISE_APPLICATION_ERROR(-20000, '[SEM DADOS]');
          WHEN OTHERS THEN
            RAISE_APPLICATION_ERROR(-20000, 'PG_RELATORIOS.SP_SE_PRVSAO_15_DIAS: ' || SQLERRM);

end SP_SE_PRVSAO_15_DIAS;
Responder

Gostei + 0

03/09/2013

Guilherme Silva

2º parte script conversor de clob para blob

FUNCTION FC_SE_CONVERT_CLOB_BLOB( c IN CLOB ) RETURN BLOB
-- typecasts CLOB to BLOB (binary conversion)
IS
pos PLS_INTEGER := 1;
buffer RAW( 32767 );
res BLOB;
lob_len PLS_INTEGER := DBMS_LOB.getLength( c );
BEGIN
DBMS_LOB.createTemporary( res, TRUE );
DBMS_LOB.OPEN( res, DBMS_LOB.LOB_ReadWrite );

LOOP
buffer := UTL_RAW.cast_to_raw( DBMS_LOB.SUBSTR( c, 16000, pos ) );

IF UTL_RAW.LENGTH( buffer ) > 0 THEN
DBMS_LOB.writeAppend( res, UTL_RAW.LENGTH( buffer ), buffer );
END IF;

pos := pos + 16000;
EXIT WHEN pos > lob_len;
END LOOP;

RETURN res; -- res is OPEN here
END FC_SE_CONVERT_CLOB_BLOB;
Responder

Gostei + 0

03/09/2013

José

Olá amigo Guilherme, pelo que pudi perceber conseguiu encontrar a solução para sua duvida ,certo ?
Responder

Gostei + 0

03/09/2013

Guilherme Silva

Correto, consegui encontrar uma solução viável para meu problema.
Responder

Gostei + 0

03/09/2013

José

Obrigado pelo retorno amigo, sendo assim estou concluindo o tópico.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar