-
Pb de type
Bonjour,
supposons une table TRSCOMPTT avec un champ IDCASE et une vingtaine d'autres champs.
IDCASE permet de distinguer les types de lignes.
Les lignes de type B1 doivent avoir les champs numéro 2, 3, 4 obligatoires
Les lignes de type B2 doivent avoir les champs numéro 2, 3, 6 obligatoires
Les lignes de type B2 doivent avoir les champs numéro 8, 10, 11 obligatoires
...
Pour vérifier que chaque type de lignes a ses champs obligatoires de renseigné, j'ai créé une petite routine s'appuyant sur une table de paramétrage REFVCASET contenant un champ IDCASE, et un champ IDCHAMP. Cette table donne pour chaque case, les champs obligatoires.
Le jeu consiste à lister les lignes dont les champs obligatoires ne sont pas renseignés pour la case. Voici mon bout de code qui ne me ramène rien alors qu'il devrait. Le pb vient probablement de "l'égalité" REC_CHAMP.IDCHAMP is null. Il faudrait transformer le résultat du curseur en un champ... Qui sait faire ?
/* Sélection des données transmises par Arvato */
cursor CUR_CASE is
select distinct IDCASE from TRSCOMPTT;
/* Curseur de sélection des champs obligatoire par case */
cursor CUR_CHAMP (v_idcase varchar2) is
select IDCHAMP
from REFVCASET
for REC_CASE in CUR_CASE loop
for REC_CHAMP in CUR_CHAMP (REC_CASE.IDCASE) loop
/* Insertion des enregistrements rejetés */
insert into EXPCOMPTT (MSCPT,ETAT,IDCASE,IDSOCAS,
IDTITRE,NOPARUT,IDFAPRD,IDARTIC,
IDPAYS,IDGRP,IDTYRGL,IDSOCASD,
IDTITRED,NBEX,MTTTC,IDTVARG,
IDTVATY,TXTVA,MTHT,MTTVA)
select MSCPT,ETAT,IDCASE,IDSOCAS,
IDTITRE,NOPARUT,IDFAPRD,IDARTIC,
IDPAYS,IDGRP,IDTYRGL,IDSOCASD,
IDTITRED,NBEX,MTTTC,IDTVARG,
IDTVATY,TXTVA,MTHT,MTTVA
from TRSCOMPTT
where IDCASE = REC_CASE.IDCASE
and REC_CHAMP.IDCHAMP is null;
end loop;
end loop;
commit;
-
En SQL la notion de "champ" n'existe pas. On parler de colonne.
De plus les bases de données relationelles ne connaissent en aucun cas le moindre concept d'ordre tel que la numérotation d'une colonne. Cela c'est de la pure fantaisie. Dès lors ta manipulation s'avère impossible en pratique. En revanche, c'est possible avec les noms des colonnes.
Décrit donc ta table en respectant ceci http://www.developpez.net/forums/viewtopic.php?t=32668 et nous t'aiderons.
La solution de ton problème passe par l'implémentationn d'un trigger.
A +
-
Désolé l'indentation, je n'ai pas trouvé comment faire !
Voici les tables
CREATE TABLE TRSCOMPTT
(
MSCPT VARCHAR2(6) NOT NULL,
ETAT VARCHAR2(6) NOT NULL,
IDCASE VARCHAR2(3) NOT NULL,
IDSOCAS VARCHAR2(6),
IDTITRE VARCHAR2(6),
NOPARUT INTEGER,
IDFAPRD VARCHAR2(2),
IDARTIC VARCHAR2(12),
IDPAYS VARCHAR2(2),
IDGRP VARCHAR2(10),
IDTYRGL VARCHAR2(2),
IDSOCASD VARCHAR2(6),
IDTITRED VARCHAR2(6),
NBEX NUMBER(12,6),
MTTTC NUMBER(18,6),
IDTVARG VARCHAR2(2),
IDTVATY VARCHAR2(2),
TXTVA NUMBER(6,3),
MTHT NUMBER(18,6),
MTTVA NUMBER(18,6)
)
TABLESPACE DATATRANS
PCTUSED 40
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 5M
NEXT 2M
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
FREELISTS 1
FREELIST GROUPS 1
BUFFER_POOL DEFAULT
)
LOGGING
NOCACHE
NOPARALLEL;
CREATE TABLE REFVCASET
(
IDCASE VARCHAR2(3) NOT NULL,
IDCHAMP VARCHAR2(8) NOT NULL
)
TABLESPACE DATAREF
PCTUSED 40
PCTFREE 10
INITRANS 1
MAXTRANS 255
STORAGE (
INITIAL 56K
NEXT 24K
MINEXTENTS 1
MAXEXTENTS 2147483645
PCTINCREASE 0
FREELISTS 1
FREELIST GROUPS 1
BUFFER_POOL DEFAULT
)
LOGGING
NOCACHE
NOPARALLEL;
-
Game over !
Je m'en suis sorti comme cela finalement ! Création d'une requete dans une variable et execution de cette requete
for REC_CASE in CUR_CASE loop
for REC_CHAMP in CUR_CHAMP (REC_CASE.IDCASE) loop
/* Insertion des enregistrements rejetés */
W_REQ:='insert into EXPCOMPTT (MSCPT,ETAT,IDCASE,IDSOCAS,
IDTITRE,NOPARUT,IDFAPRD,IDARTIC,
IDPAYS,IDGRP,IDTYRGL,IDSOCASD,
IDTITRED,NBEX,MTTTC,IDTVARG,
IDTVATY,TXTVA,MTHT,MTTVA)
select MSCPT,ETAT,IDCASE,IDSOCAS,
IDTITRE,NOPARUT,IDFAPRD,IDARTIC,
IDPAYS,IDGRP,IDTYRGL,IDSOCASD,
IDTITRED,NBEX,MTTTC,IDTVARG,
IDTVATY,TXTVA,MTHT,MTTVA
from TRSCOMPTT
where IDCASE = '''||REC_CASE.IDCASE || ''' and ' || REC_CHAMP.IDCHAMP||' is null';
CURSOR_NAME:=DBMS_SQL.OPEN_CURSOR;
dbms_sql.parse(CURSOR_NAME,W_REQ,DBMS_SQL.native);
RET:=dbms_sql.execute(CURSOR_NAME);
dbms_sql.close_cursor(CURSOR_NAME);
end loop;
end loop;