2017-05-27 8 views
0

私は、複雑なPL/SQLプロシージャをコーディングして、パラメータから決められた期間の給与明細に関する画面情報を表示し、各従業員に関する情報を表示するための最初のループと、給与に関する情報を表示するための2番目のループを作成します両方のループは私が表示できるように情報を表示しません。Oracle - このPLSQLネストループを改善して情報を取得する方法を教えてください。

  1. 最初のカーソルは、第二のカーソルが給与の概念(連邦税、社会保障、控除など)に関する情報を取得従業員に関する情報(EMP_ID、姓、名、など)
  2. を取得
FOR i IN (SELECT a.legajo, a.apellido, a.nombre, 
        formatear_cuit_cuil(a.cuil) CUIL, a.fecha_alta, 
        b.numero, b.fecha_liquidacion, b.sueldo_basico, 
        b.codigo_periodo_liq 
      FROM  empleados a 
      JOIN  liquidaciones b 
      ON  (a.legajo = b.legajo_empleado) 
      WHERE b.fecha_liquidacion = v_fecha_liq 
      ORDER BY a.apellido, a.nombre ASC) 
LOOP 
    FOR j IN (SELECT b.descripcion CONCEPTO, a.cantidad, 
        (CASE 
          WHEN c.descripcion LIKE 'HABER' THEN 
           a.importe 
          ELSE 
           NULL 
          END 
        ) haberes, 
        (CASE 
          WHEN c.descripcion = 'ANTICIPO' 
          OR c.descripcion = 'RETENCION' THEN 
           a.importe 
          ELSE 
           NULL 
          END 
        ) retenciones 
       FROM detalles_liquidaciones a 
       JOIN conceptos b 
       ON  (a.codigo_concepto = b.codigo) 
       JOIN tipos_conceptos c 
       ON  (b.codigo_tipo = c.codigo) 
       WHERE a.numero_liquidacion = i.numero 
       AND c.descripcion IN ('HABER', 'RETENCION', 'ANTICIPO')) 
    LOOP   
     DBMS_OUTPUT.PUT_LINE(
      'Empleado: ' || LPAD(i.legajo, 4, 0) || ' - ' || 
      UPPER(i.apellido) || ', ' || UPPER(i.nombre)); 

     DBMS_OUTPUT.PUT_LINE('CUIL: ' || i.cuil); 

     DBMS_OUTPUT.PUT_LINE(
      RPAD('Concepto', LENGTH(j.concepto), ' ') || 
        ' Haberes' || ' Retenciones'); 

     DBMS_OUTPUT.PUT_LINE(j.concepto); 

私はそのようなコンソールの何かに表示する:enter image description here

しかし、給与の概念ごとに同じ従業員の情報が表示されます。あなたは何か考えていますか?おかげ

enter image description here

+1

あなたはdbms_outputを使用して画面にデータを表示しますか? –

+0

私の投稿を編集していただきありがとうございます。はい、最後に問題を修正できましたが、最初のスクリーンショットと同じように、コードを編集して(DBMS_OUTPUTを使用して)画面に表示したいと思います。私は新しい質問を加えるべきだと思う。あなたの助けに感謝ウィリアム。 –

答えて

2

は、私はあなたが従業員の詳細はこれを試して

繰り返し印刷を避けるために、第2ループの前にDBMS_OUTPUTを配置し、それが動作するかどうか、私は知っているように持っていると思う

FOR i IN (SELECT a.legajo, a.apellido, a.nombre, formatear_cuit_cuil(a.cuil) CUIL, 
    a.fecha_alta, b.numero, b.fecha_liquidacion, b.sueldo_basico, b.codigo_periodo_liq 
    FROM empleados a 
    JOIN 
    liquidaciones b 
    ON (a.legajo = b.legajo_empleado) 
    WHERE b.fecha_liquidacion = v_fecha_liq 
    ORDER BY a.apellido, a.nombre ASC) 
    LOOP 


        DBMS_OUTPUT.PUT_LINE(
         'Empleado: ' || LPAD(i.legajo, 4, 0) || ' - ' || 
         UPPER(i.apellido) || ', ' || UPPER(i.nombre)); 

        DBMS_OUTPUT.PUT_LINE('CUIL: ' || i.cuil); 

       FOR j IN (SELECT b.descripcion CONCEPTO, a.cantidad, 
           (CASE 
             WHEN c.descripcion LIKE 'HABER' THEN 
              a.importe 
             ELSE 
              NULL 
            END 
           ) haberes, 
           (CASE 
             WHEN c.descripcion = 'ANTICIPO' 
              OR c.descripcion = 'RETENCION' THEN 
              a.importe 
             ELSE 
              NULL 
             END 
           ) retenciones 
          FROM detalles_liquidaciones a 
          JOIN conceptos b 
          ON (a.codigo_concepto = b.codigo) 
          JOIN tipos_conceptos c 
          ON (b.codigo_tipo = c.codigo) 
          WHERE a.numero_liquidacion = i.numero 
          AND c.descripcion IN ('HABER', 'RETENCION', 'ANTICIPO')) 
       LOOP 


        DBMS_OUTPUT.PUT_LINE(
         RPAD('Concepto', LENGTH(j.concepto), ' ') || 
         ' Haberes' || ' Retenciones'); 

        DBMS_OUTPUT.PUT_LINE(j.concepto); 

     END LOOP; 
     END LOOP; 
+0

あなたはGENIUSです!それはうまく動作します!ご協力いただきありがとうございます。私はとても感謝しています。私はあなたの答えを選びました! –

関連する問題