Vous consultez une page technique concernant le logiciel de gestion Mercator. Celle-ci contient des informations spécifiques destinées aux professionnels de Mercator. Souhaitez-vous être redirigés vers des informations plus générales ?


   Ne plus poser cette question

Dans un inventaire, les lignes des articles inventoriés mais non modifiés ne sont pas repris dans LIGNES_D

0000002891     -      16/11/2021

La saisie d'un inventaire produit des enregistrements dans la table LIGNES_D. Toutefois, cette table ne reprend que les lignes pour lesquelles il y a eu effectivement une modification d'inventaire. Si la quantité en stock était déjà correcte au moment de l'inventaire, alors aucun enregistrement n'est créé dans LIGNES_D. En effet, cet enregistrement contiendrait un mouvement avec une quantité à zéro. Ceci permet de limiter la croissance de la taille de la table LIGNES_D.

On constate que, lors de la réouverture d'un inventaire, ces lignes sont toutefois bien présentes dans l'interface de Mercator. Pour permettre cela, Mercator les a sauvegardées en tant que chaîne XML (correspondant à un DataSet .net) dans PIEDS_D.INVENT_ZERO.

Ces lignes peuvent être exploitées en SQL. Pour cela, il est nécessaire d'effectuer une conversion telle qu'illustrée ci-dessous.

Exemple 1 : obtenir les lignes à zéro pour un seul inventaire

declare @xmlData XML, @idoc INT
select @xmlData=INVENT_ZERO  from PIEDS_D where ...

EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlData

SELECT * 
   FROM  OPENXML (@idoc, '/NewDataSet/dt_inv0', 2)
   WITH ([ID] [char](10),
[NATURE] [char](10),
[ID_DEPOT] [char](10),
[DATE] char(20),
[ID_ART] [char](10),
[Q] [float],
[PU] [float],
[TOTAL] [float],
[PIECE] [numeric](11, 0),
[ID_DOC] [char](10),
[NUM_SERIE] [char](19),
[SERIE] [bit],
[ID_USER] [char](10),
[HEURE] [char](5),
[REFERENCE] [char](30),
[ID_LOT] [char](10),
[ID_LOT_ORI] [char](10),
[ID_DEPOT1] [char](10),
[ID_DEPOT2] [char](10),
[Q_ORI] [decimal](15, 5),
[RECNO] [decimal](10, 0),
[LIGNE2] [bit],
[BLOQUE_D1] [bit],
[BLOQUE_D2] [bit],
[ID_LIGNE1] [char](10),
[TYPE] [smallint],
[ID_PROJET] [char](10),
[ID_DESTIN] [char](10),
[DPA] [float],
[PMPA] [float],
[PRIX_REV] [float],
[DISPO] [float],
[CENTRALE] [bit],
[ID_MPLACE] [char](10),
designatio [char](200),
lib_proj [char](200),
lib_dest [char](200),
lib_mplace [char](200),
lib_lot [char](200)
)

La syntaxe ci-dessus doit être adaptée à la structure de votre LIGNES_D et à l'entête trouvée dans la chaîne XML. Les noms de colonnes en majuscules correspondent à la structure de la table LIGNES_D, ceux en minuscules sont relatifs à des colonnes supplémentaires. Cette liste de colonnes doit être adaptée à votre dossier. Notez que la colonne DATE doit être déclarée comme char(20).

Exemple 2 : obtenir les lignes à zéro pour plusieurs inventaires

L'exemple 1 peut être étendu à plusieurs inventaires. Pour cela, il faut utiliser le code SQL repris ci-dessous. L'adaptation des colonnes doit être effectuée comme dans l'exemple n°1 mais cette fois à deux endroits.

declare @i int, @count int, @xmlData XML, @idoc INT

create table #INVENT_ZERO_TMP (
[ID] [char](10),
[NATURE] [char](10),
[ID_DEPOT] [char](10),
[DATE] char(20),
[ID_ART] [char](10),
[Q] [float],
[PU] [float],
[TOTAL] [float],
[PIECE] [numeric](11, 0),
[ID_DOC] [char](10),
[NUM_SERIE] [char](19),
[SERIE] [bit],
[ID_USER] [char](10),
[HEURE] [char](5),
[REFERENCE] [char](30),
[ID_LOT] [char](10),
[ID_LOT_ORI] [char](10),
[ID_DEPOT1] [char](10),
[ID_DEPOT2] [char](10),
[Q_ORI] [decimal](15, 5),
[RECNO] [decimal](10, 0),
[LIGNE2] [bit],
[BLOQUE_D1] [bit],
[BLOQUE_D2] [bit],
[ID_LIGNE1] [char](10),
[TYPE] [smallint],
[ID_PROJET] [char](10),
[ID_DESTIN] [char](10),
[DPA] [float],
[PMPA] [float],
[PRIX_REV] [float],
[DISPO] [float],
[CENTRALE] [bit],
[ID_MPLACE] [char](10),
designatio [char](200),
lib_proj [char](200),
lib_dest [char](200),
lib_mplace [char](200),
lib_lot [char](200))

select ROW_NUMBER() over (order by id_doc,nature,piece) AS RowNumber,INVENT_ZERO into #PIEDS_D_TMP from PIEDS_D where ... and invent_zero != ''
set @i=1
select @count=isnull(max(RowNumber),0) from #PIEDS_D_TMP

while @i <= @count
begin
select @xmlData=INVENT_ZERO from #PIEDS_D_TMP where RowNumber=@i
EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlData

insert into #INVENT_ZERO_TMP
SELECT * 
   FROM  OPENXML (@idoc, '/NewDataSet/dt_inv0', 2)
   WITH ([ID] [char](10),
[NATURE] [char](10),
[ID_DEPOT] [char](10),
[DATE] char(20),
[ID_ART] [char](10),
[Q] [float],
[PU] [float],
[TOTAL] [float],
[PIECE] [numeric](11, 0),
[ID_DOC] [char](10),
[NUM_SERIE] [char](19),
[SERIE] [bit],
[ID_USER] [char](10),
[HEURE] [char](5),
[REFERENCE] [char](30),
[ID_LOT] [char](10),
[ID_LOT_ORI] [char](10),
[ID_DEPOT1] [char](10),
[ID_DEPOT2] [char](10),
[Q_ORI] [decimal](15, 5),
[RECNO] [decimal](10, 0),
[LIGNE2] [bit],
[BLOQUE_D1] [bit],
[BLOQUE_D2] [bit],
[ID_LIGNE1] [char](10),
[TYPE] [smallint],
[ID_PROJET] [char](10),
[ID_DESTIN] [char](10),
[DPA] [float],
[PMPA] [float],
[PRIX_REV] [float],
[DISPO] [float],
[CENTRALE] [bit],
[ID_MPLACE] [char](10),
designatio [char](200),
lib_proj [char](200),
lib_dest [char](200),
lib_mplace [char](200),
lib_lot [char](200)
)
set @i=@i+1
end
select * from #INVENT_ZERO_TMP order by nature, piece, recno
drop table #INVENT_ZERO_TMP
drop table #PIEDS_D_TMP