U bevindt zich nu op een technische pagina over de software Mercator. Deze pagina bevat specifieke informatie die bestemd is voor professionals van de software Mercator. Wenst u naar algemenere informatie over Mercator door te gaan?


   Deze vraag niet meer stellen

MercatorPenguin in schrijf-modus : documenten voor Commercieel Beheer met lijnen

0000002982     -      25-11-2020

MercatorPenguin 2.8 maakt het aanmaken en wijzigen documenten van het Commercieel Beheer met regels en voor alle soorten documenten (offertes, bestellingen, leveringen, facturen, ... aan- en verkopen) mogelijk. In tegenstelling tot het bewerken van documenten zonder lijn, vereist dit een specifieke licentie per mobiel apparaat dat deze functionaliteit gebruikt (PENGUINBILLING = ...), evenals een versie 10.7 of later van Mercator. Er moet echter worden opgemerkt dat een instelling "zonder lijn" compatibel is met een instelling "met lijn". Alleen de aanwezigheid van een ListViewCell XAML-instelling maakt het verschil.

Het beheer van de licenties bevat een systeem voor het activeren en deactiveren van mobiele apparaten die deze functionaliteit kunnen gebruiken. Deze deactivering kan worden uitgevoerd via de onderhoudspagina van MercatorPenguinServer of via de onderhoudsbundel. In alle gevallen moet MercatorPenguinServer verbinding kunnen maken met een webservice die wordt gehost door Mercator (host = restapi.mercator.eu) op de https-poort (tcp 443). De functionaliteit die op deze pagina wordt beschreven, is niet beschikbaar als MercatorPenguinServer niet met deze server kan communiceren.

Opmerking over GDPR over dit onderwerp : in het kader van dit licentiebeheer via een mobiel apparaat wordt alleen deze informatie verzonden :

  • de unieke identificatie van het apparaat, willekeurig gegenereerd : bijvoorbeeld 3f2504e0-4f89-11d3-9a0c-0305e82c3301
  • de naam van de host die MercatorPenguinServer host: bijvoorbeeld penguin.mercator.eu
  • de naam van de configuratie (naam van het MercatorPenguinServer ini-bestand).

Er worden geen persoonlijke gegevens van de gebruiker of gegevens in Mercator of MercatorPenguin gecommuniceerd.


Toegang tot een document wordt altijd gedaan vanuit een "Lijst" -type bundel, via een BillingEditButton-knop, waarvan de volgende eigenschappen moeten worden gespecificeerd :

  • BillingTypeVA = V voor een verkoop, A voor een aankoop
  • BillingId = document-ID in tabel PIEDS_V / A
  • BillingJournal = het journaal van het document
  • BillingPiece = het documentnummer
  • BillingType = de waarde van TYPE in PIEDS_V / A.
  • BillingTargetSequence (optionnele)  = bestemming journaal om naar deze sequentie te transformeren
<m:BillingEditButton Text="Modifier" Font="Small" 
BillingTypeVA="V" BillingId="@ID" BillingJournal="@JOURNAL" BillingPiece="@PIECE" BillingType="@TYPE" />

Voorbeeld van een lijstbundel : Brouillons_edition_lignes.pngb

De lay-out van een wijzigingsvenster in MercatorPenguin moet worden gemaakt in XAML, te beginnen met een fiche van de overeenstemmende sequentie "Tools> Sequenties> Verkopen of Aankopen" van Mercator en met behulp van dit element van deze vervolgkeuzeknop :

 

Een scherm van een document van het Commercieel Beheer met lijnen vereist twee XAML-instellingen :

  1. de eigenlijke invoer : de informatie van de hoofding en de lijn die wordt bewerkt
  2. het formaat van elke cel in de ListView met de lijnen van het huidige document.

Voorbeeld van het instellen van XAML Tab 1

<StackLayout Margin="10, 10, 10, 10">
<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand">
<m:EditEntry Placeholder="Client" Source="id_cli" Margin="0,0,25,0" WidthRequest="120" />
<m:TargetSigLabel Origin="id_cli" Font="Medium" VerticalOptions="Center" HorizontalOptions="FillAndExpand" />
</StackLayout>
<m:EditDatePicker Source="date" HorizontalOptions="FillAndExpand" />
<m:EditPicker Source="id_depot" HorizontalOptions="FillAndExpand" />
<m:EditPicker Source="tarif" HorizontalOptions="FillAndExpand" />
<m:EditEntry Placeholder="Reference" Source="reference" HorizontalOptions="FillAndExpand" />

<BoxView HorizontalOptions="FillAndExpand" HeightRequest="2" Margin="0,25,0,25" Color="%ThemeColor%"/>

<Grid RowSpacing="10" ColumnSpacing="2">
<Grid.ColumnDefinitions>
        <ColumnDefinition Width="120" />
<ColumnDefinition Width="25" />
<ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="50" />
    </Grid.RowDefinitions>

<m:EditEntry Placeholder="Article" Source="LINE|ID_ARTICLE" HorizontalOptions="FillAndExpand" Grid.Column="0" Grid.Row="0" />
<m:EditScanButton TargetSource="LINE|ID_ARTICLE" Grid.Column="1" Grid.Row="0" />
<m:TargetSigLabel Origin="LINE|ID_ARTICLE" Font="Medium" VerticalOptions="Center" HorizontalOptions="FillAndExpand" Margin="10,0,0,0" Grid.Column="2" Grid.Row="0" />

<m:EditEntry Placeholder="Désignation" Source="LINE|DESIGNATIO" HorizontalOptions="FillAndExpand" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="3" />

<Label Text="Q" FontSize="12" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,5,0" Grid.Column="0" Grid.Row="2" />
<m:EditEntry Source="LINE|Q" WidthRequest="120" Decimals="2" Grid.Column="2" Grid.Row="2" />

<Label Text="PU" FontSize="12" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,5,0" Grid.Column="0" Grid.Row="3" />
<m:EditEntry Source="LINE|PU" WidthRequest="120" Decimals="2" Grid.Column="2" Grid.Row="3" />

<Label Text="Remise" FontSize="12" VerticalOptions="Center" HorizontalOptions="End" Margin="0,0,5,0" Grid.Column="0" Grid.Row="4" />
<m:EditEntry Source="LINE|REMISE" WidthRequest="120" Decimals="2" Grid.Column="2" Grid.Row="4" />

</Grid>

<m:EditAddLineButton CheckDispo="true" Margin="25,25,25,0" HorizontalOptions="FillAndExpand" />

<m:EditTransformButton Margin="25,25,25,0" HorizontalOptions="FillAndExpand" Text="Transformer Document">
<m:EditTransformButton.TargetSequences>
        <x:Array Type="{x:Type m:ItemString}">
            <m:ItemString Id="1Fact" Lib="Facture" />
            <m:ItemString Id="1Bliv" Lib="Livraison" />
            <m:ItemString Id="1Devi" Lib="Devis" />
        </x:Array>
</m:EditTransformButton.TargetSequences>
</m:EditTransformButton>

<BoxView HorizontalOptions="FillAndExpand" HeightRequest="2" Margin="0,25,0,25" Color="%ThemeColor%"/>

<StackLayout Orientation="Horizontal">   
<Label Text="Remise gén. (" Margin="0,0,0,0" />
<Label Text="@RED_GEN_PC:##0.00" />
<Label Text=" %)" Margin="0,0,0,0" />
<Label Text="@RED_GEN_DV:### ##0.00" />
</StackLayout>
<StackLayout Orientation="Horizontal">   
<Label Text="Total HT = " Margin="0,0,10,0" />
<Label Text="@TOT_BAS_DV:### ##0.00" />
</StackLayout>
<StackLayout Orientation="Horizontal">   
<Label Text="Total TVA = " Margin="0,0,10,0" />
<Label Text="@TOT_TVA_DV:### ##0.00" />
</StackLayout>
<StackLayout Orientation="Horizontal" Margin="0,0,0,25">   
<Label Text="Total TTC = " Margin="0,0,10,0" />
<Label Text="@TOT_TTC_DV:### ##0.00" />
</StackLayout>

</StackLayout>

Voorbeeld van het instellen van XAML ListViewCell

<StackLayout Orientation="Horizontal" HorizontalOptions="FillAndExpand">  
<Label Text="Q=" FontSize="12" Margin="0,0,10,0" />
<Label Text="@Q:### ##0.00" FontSize="12" Margin="0,0,25,0" />
<Label Text="PU=" FontSize="12" Margin="0,0,10,0" />
<Label Text="@PU:### ##0.00" FontSize="12" Margin="0,0,25,0" />
<Label Text="%=" FontSize="12" Margin="0,0,10,0" />
<Label Text="@REMISE:##0.00" FontSize="12" Margin="0,0,25,0" HorizontalOptions="FillAndExpand" />
</StackLayout>
<StackLayout Orientation="Horizontal">   
<Label Text="@ID_ARTICLE" FontSize="12" Margin="0,0,10,0" />
<Label Text="@DESIGNATIO" FontSize="12" />
</StackLayout>
<StackLayout Orientation="Horizontal">   
<Label Text="Emplacement" FontSize="12" Margin="0,0,10,0" />
<Label Text="@ID_MPLACE" FontSize="12" />
</StackLayout>

Deze XAML-code produceert deze schermen :

BillingLignesNL1     BillingLignesNL2     billinglignes4

Principes van parametrage

In de eerste XAML-code moeten controles van het type Edit worden gebruikt waarmee de velden van de hoofding (boven de eerste oranje lijn) en van de lijn die wordt bewerkt (onder de oranje lijn) kunnen worden gewijzigd. Deze lijnvelden hebben een bron die bestaat uit LINE| gevolgd door de naam van de kolom in de tabel LIGNES_V / A. De totalen en andere niet-wijzigbare informaties zijn opgenomen in de vorm van Labels (zie onder de tweede oranje lijn).

De invoer van het artikel online gebeurt altijd in een EditEntry, waarvan de bron LINE|ID_ARTICLE is. Deze bron wordt herkend als een link naar het Artikelbestand, waardoor de aanduiding van de omschrijving in een TargetSigLabel kan worden weergegeven. (Zie de SQL-functie LIBTARGETSIG_STOCK die aanpasbaar is).

De XAML-code moet een EditAddLineButton bevatten waarmee de huidige regel kan worden toegevoegd aan de lijst met reeds ingegeven lijnen.

In de tweede XAML-code (ListViewCell) moeten de weer te geven variabelen worden voorafgegaan door een @ en in hoofdletters. Het is mogelijk om een weergavemasker in te stellen in de vorm @COLUMN: mask. Dit masker werkt identiek aan dat van string.Format() van het .net Framework.

Toepassing

Als het dossier Locatiebeheer bevat, kan de gebruiker de locatie invoeren. Anders kan de eerste row van het raster worden verwijderd en kan alle Grid.Row met 1 worden verlaagd. Merk op dat de waarde van de ingevoerde locatie nooit wordt gereset, wat het mogelijk maakt om de locatie eenmaal in te voeren en vervolgens meerdere items die zich op die locatie bevinden in te voeren.

De gebruiker voert dan een artikelcode in. Indien nodig toont MercatorPenguin een lijst met artikels om een selectie mogelijk te maken. Hij kan dan andere informatie invoeren zoals hoeveelheid, prijs, korting, ...

Ten slotte moet de gebruiker de regel die wordt ingevoerd effectief toevoegen aan de lijst op het tweede tabblad met behulp van de knop "Toevoegen". Hierdoor worden de artikelgegevens gereset en wordt de focus in het gebied "Artikel" geplaatst, zodat het volgende artikel kan worden ingevoerd.

Het ophalen van Artikels en locaties kunnen worden gemaakt via de EditScanButton om een barcode te scannen.

Op het tweede tabblad kunt u de lijst met de ingegeven lijnen bekijken. Hiermee kunt u ook een eerder ingegeven lijn verwijderen :

  • in iOS: door de lijn naar links te slepen en vervolgens de knop "Verwijderen" te gebruiken
  • op Android: door de lijn ingedrukt te houden en vervolgens de knop "Verwijderen" te gebruiken.

Het is niet mogelijk om een lijn in de lijst opnieuw te bewerken om deze te wijzigen. Indien nodig moet het daarom worden verwijderd en opnieuw worden gemaakt.

De afronding van een document wordt gedaan door middel van deze knoppen bovenaan het scherm, die respectievelijk deze functies bieden :

  • Annuleer de huidige wijzigingen en sluit het documentscherm
  • Sla de huidige wijzigingen op en sluit het documentscherm
  • Sla de huidige wijzigingen op terwijl u het huidige documentscherm open houdt.

Nadat een document is opgeslagen, verschijnt er een derde tabblad: hiermee kunt u een voorbeeld van het document in PDF formaat bekijken. Het afdrukmodel nr. 1 gedefinieerd in de reeks wordt gebruikt.

BillingLignesNL2    penguindocNL2

 

Levensduur van BillingEngines

In tegenstelling tot de Inventarissen beheerd door MercatorPenguin, wordt een BillingEngine die door MercatorPenguinServer is geopend om bewerking van het bijbehorende document in MercatorPenguin mogelijk te maken, niet onmiddellijk gesloten. MercatorPenguinServer heeft deze BillingEngine namelijk nodig, met name om de prijs te bepalen van elk item dat in de mobiele applicatie wordt aangeroepen. Alleen het opslaan "In afwachting van wijzigingen opslaan en documentscherm sluiten" sluit de BillingEngine. Er wordt aan herinnerd dat een in MercatorPenguinServer geopende BillingEngine tot gevolg heeft dat het bijbehorende document niet kan worden gewijzigd, noch in Mercator Desktop, noch op een ander mobiel apparaat. Er wordt ook aan herinnerd dat MercatorPenguinServer als webtoepassing op elk moment kan herstarten (gedwongen handmatige herstart of geplande herstart door IIS). In dergelijke gevallen gebruikt MercatorPenguinServer de mogelijkheid om een gesloten BillingEngine opnieuw te openen waarvan de toegang opnieuw vereist zou zijn.

Om te voorkomen dat BillingEngines voor onbepaalde tijd open blijft, heeft MercatorPenguinServer een vertraging waardoor een BillingEngine die langer dan 15 minuten inactief is, automatisch wordt gesloten. Het is mogelijk om deze waarde te wijzigen door deze regel toe te voegen / te wijzigen in het ini-bestand :

AutoCloseBillingEngine = 15

 

Beperkingen

Het is noodzakelijk om te begrijpen dat de back-ups uitsluitend worden uitgevoerd door MercatorPenguinServer en dat deze stateless zijn. Dit betekent dat tijdens de hele levensduur van het document in MercatorPenguin, het document niet noodzakelijkerwijs open wordt gehouden door MercatorPenguinServer. Daarom is het mogelijk dat een andere gebruiker het document parallel aanpast. Deze praktijk moet worden vermeden. Bij het opslaan van wijzigingen gelden de volgende regels :

  • De lijnen die in MercatorPenguin zijn verwijderd, worden door MercatorPenguinServer verwijderd als ze nog bestaan. Anders wordt er geen foutmelding gegeven.
  • De lijnen die zijn toegevoegd in MercatorPenguin, worden altijd toegevoegd door MercatorPenguinServer.

 

Informatiestroom

Bij het oproepen van een artikel in een MercatorPenguin-document wordt een SQL-query geselecteerd die alle kolommen van de STOCK-tabel selecteert. Het is mogelijk om er extra kolommen aan toe te voegen via de eigenschap ReqSql2ExtraColumns van de EditEntry waarvan de bron LINE|ID_ARTICLE is.
Bijvoorbeeld :

ReqSql2ExtraColumns="stock.s_cle2+stock.s_cle3 as mycol1,dbo.MYFUNC(stock.s_id) as mycol2"

Dit maakt het mogelijk om automatisch mogelijke Edit controls waarvan de bron LINE|MYCOL1 of LINE|MYCOL2 zou zijn, te voeden. Uiteindelijk is het dus mogelijk om automatisch de kolommen LIGNES_V/A.MYCOL1 en LIGNES_V/A.MYCOL2 te voeden.

Merk op dat het nooit nodig is om de kolommen van de tabel STOCK aan te geven die ook in LIGNES_V/A zouden bestaan, aangezien het standaardmechanisme van artikelinvoeging van Mercator deze velden al automatisch invult.

 

Programmeren

De customizers die gebruikmaken van evenementen van BillingEngine worden goed gebruikt door MercatorPenguinServer. Het is mogelijk om te weten of het document wordt beheerd door MercatorPenguin met behulp van deze eigenschap: MercatorUi.Globals.IsMercatorPenguinServer.

Ter herinnering: het is onmogelijk om aangepaste code uit te voeren op het mobiele apparaat. Er is daarom geen customizer die als zodanig in de toepassing MercatorPenguin "draait". Android- en iOS-platforms staan dit niet toe. Daarom zal dit punt nooit worden gewijzigd.

Tips

Zie hoe de parametrering van documenten voor commercieel beheer met lijnen verfijnen.


Overwegingen bij het omzetten van documenten

Het is mogelijk om document omzettingen (sequentie verandering) uit te voeren via een EditTransformButton-knop. (Zie in het voorbeeld "XAML Tab 1 instellingen" hierboven). De code voor deze knop moet er als volgt uitzien :

<m:EditTransformButton Margin="25,25,25,0" HorizontalOptions="FillAndExpand" Text="Transformer Document">
<m:EditTransformButton.TargetSequences>
<x:Array Type="{x:Type m:ItemString}">
<m:ItemString Id="1Fact" Lib="Facture" />
<m:ItemString Id="1Bliv" Lib="Livraison" />
<m:ItemString Id="1Devi" Lib="Devis" />
</x:Array>
</m:EditTransformButton.TargetSequences>
</m:EditTransformButton>

In de array van de eigenschap TargetSequences moet u de reeksen vermelden waarnaar de gebruiker zijn document kan transformeren. Er is geen onderscheid te maken tussen een horizontale verandering, een omzetting naar een later of eerder stadium. Dit aspect wordt automatisch herkend door MercatorPenguinServer.

Als u op deze knop klikt, wordt er een dialoogvenster weergegeven waarin de gebruiker de volgorde van de bestemming kan kiezen.

TransformAndroidNL    TransformNL

De omzetting wordt uitgevoerd door MercatorPenguinServer tijdens de volgende Bewaren. Merk op dat zodra de omzetting is aangevraagd maar nog niet is uitgevoerd (Bewaren niet uitgevoerd), het label van deze knop "Annuleren wijziging in ..." wordt. Dit annuleert het verzoek van de omzetting. De controles met betrekking tot de geldigheid van de gevraagde omzetting worden uitsluitend uitgevoerd door MercatorPenguinServer, dus ten tijde van het Bewaren. Evenzo worden alle customizers die aan dit evenement zijn gekoppeld, uitgevoerd.

Opmerking: als de omzetting eenmaal is aangevraagd, is het niet langer mogelijk om het document op te slaan zonder het te sluiten.


Overweging bij serienummers

Deze functionaliteit is compatibel met het beheer van serienummers. De controles worden alleen uitgevoerd voor niveau 3 (in / uit beheer) en alleen bij opslaan. MercatorPenguin presenteert op geen enkel moment een keuzelijst met serienummers, de mobiele omgeving geeft de voorkeur aan direct scannen van een serienummer.

Om een serienummer bewerkbaar te maken, moet een EditEntry, gekoppeld aan deze bron worden toegevoegd: LINE|NUM_SERIE.
Om een serienummer zichtbaar te maken in het tabblad van de lijnen, moet u een soortgelijke code toevoegen aan de XAML-code van de ListViewCell :

<StackLayout Orientation="Horizontal">   
<Label Text="N° Série" FontSize="12" Margin="0,0,10,0" />
<Label Text="@NUM_SERIE" FontSize="12" />
</StackLayout>

Wanneer een item met een serienummer wordt gescand en Mercator weet dat het wacht op een serienummer voor het huidige sequentietype, wordt de hierboven genoemde EditEntry-achtergrondkleur gewijzigd om aan te geven dat dit gebied is verplicht. Bovendien is het onder deze voorwaarden niet mogelijk om een regel toe te voegen met een leeg serienummer.

In tegenstelling tot het gebruik van "in / uit" beheer van serienummers (niveau 3) in Mercator Desktop, heeft MercatorPenguin geen controle over het gelijktijdig gebruik van hetzelfde serienummer op twee verschillende apparaten, bij het invoeren van een lijn. Deze controle wordt alleen uitgevoerd wanneer het huidige document is opgeslagen.

Als "in / uit" beheer van serienummers is geactiveerd (niveau 3), dan houdt MercatorPenguin rekening met de optie "Codering / Zoeken serienummer" (SEARCH_SER). Als deze optie JA is, zoekt MercatorPenguin ook naar beschikbare serienummers op basis van de informatie die eraan is doorgegeven en wordt het serienummer automatisch ingevoerd. Als de gebruiker uitsluitend deze methode gebruikt (in de verkoop, scan rechtstreeks een serienummer), kunnen we de EditEntry verwijderen die is gekoppeld aan LINE|NUM_SERIE. Het is dus zeker dat de gebruiker het zojuist gescande serienummer niet zal wijzigen.


Overwegingen bij lotbeheer

MercatorPenguin is compatibel met lotbeheer, onder voorbehoud van bepaalde beperkingen die met name worden opgelegd door de ergonomie die beschikbaar is op een mobiel apparaat.

De weergave van lotinformatie op het tweede tabblad kan worden gedaan via dit type XAML-code van de ListViewCell :

<StackLayout Orientation="Horizontal">   
<Label Text="Lot" FontSize="12" Margin="0,0,10,0" />
<Label Text="@LIB_LOT" FontSize="12" />
</StackLayout>

Standaard toont dit scherm het lotnummer gevolgd door het label, gescheiden door een dubbele punt. Dit kan worden gewijzigd door de inhoud van de SQL-scalaire functie dbo.LIBARTLOT aan te passen. Het wordt automatisch geïnstalleerd door MercatorPenguinServer, maar wordt daarna nooit bijgewerkt. Bijgevolg is het toegestaan de code te wijzigen.

De meest ergonomische en directe manier om een lot te verplaatsen, is door de optie "Encoding / Search Lots" (SEARCH_LOT) in te stellen op JA. Het scannen van een bestaand lotlabel maakt dus automatische invoer mogelijk van zowel het artikel als het te gebruiken lot.

Het is ook mogelijk om een EditEntry toe te voegen die is gekoppeld aan LINE|ID_LOT en de ID van een bestaande lot in te voeren en te koppelen aan het vooraf ingevoerde item : 

<m:EditEntry Source="LINE|ID_LOT" Placeholder="Lot" />

Als we het gebruik van loten willen veralgemenen, moeten we de capaciteiten van Mercator gebruiken met betrekking tot impliciet lotbeheer, evenals de capaciteit van MercatorPenguin om elke kolom van de lijnentabel met Mercator uit te wisselen. We laten hieronder een voorbeeld zien van configuratie waarmee loten vanuit aankopen kunnen worden aangemaakt of verplaatst. De unieke sleutel is het label van het lot: als een lot met dit label niet bestaat, wordt deze aangemaakt. Als deze bestaat, verplaatst Mercator dit lot. Deze programmering is gebaseerd op de toevoeging in LIGNES_A van deze kolom, die eenvoudig zal worden gebruikt om het label van het lot van MercatorPenguin naar Mercator te verplaatsen:

alter table LIGNES_A add LOT_INFO char(25) not null default ''

In de XAML Tab 1-code van deze aankoopsequentie moet deze EditEntry worden toegevoegd :

<m:EditEntry Source="LINE|LOT_INFO" Placeholder="Lot" />

In dezelfde volgorde moet u deze customizer toevoegen die impliciet lotbeheer zal uitvoeren :

Zoom
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Windows.Forms;
using MercatorApi;
using MercatorUi;
using MercatorExtensions;
using MercatorDatabase;

namespace Billing
{
    public class Customizer : MercatorUi.ICustomizers.IBillingEngineCreated, MercatorUi.ICustomizers.IBillingEngineClosed
    {
        public void BillingEngineCreated(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
        {
            billingEngine.BeginningSave += billingEngine_BeginningSave;
        }

        public void BillingEngineClosed(MercatorUi.Engine.Gescom.BillingEngine billingEngine)
        {
            billingEngine.BeginningSave -= billingEngine_BeginningSave;
        }

        void billingEngine_BeginningSave(object sender, MercatorUi.Engine.Gescom.BillingEngine.BeginningSaveEventArgs e)
        {
            MercatorUi.Engine.Gescom.BillingEngine billingEngine = (MercatorUi.Engine.Gescom.BillingEngine)sender;
            if (MercatorUi.Globals.IsMercatorPenguinServer && billingEngine.LotsRequired)
            {
                //MercatorUi.Globals.ApiLogDelegate("..."); // écrire dans le log de MercatorPenguinServer
                using (SqlCommand cmd = new SqlCommand("", e.Connection.Connection, e.Transaction))
                {
                    cmd.CommandText = @"
                        if not exists(select * from STOCK where (s_id=@id_art) and (s_lot=1))
                        begin
                            select '' as id_lot
                            return
                        end
                        if not exists(select * from ARTLOT where (id_art=@id_art) and (lib=@lib))
                        begin
                            declare @num bigint , @id_lot char(10)
                            select @num=isnull(num,0)+1 from ARTLOT where (id_art=@id_art)
                            set @id_lot=right(newid(),10)
                            insert into ARTLOT (id_lot,id_art,id_depot,num,creation,lib) values (@id_lot,@id_art,@id_depot,@num,getdate(),@lib)
                            select @id_lot as id_lot
                        end
                        else
                            select id_lot from ARTLOT where (id_art=@id_art) and (lib=@lib)";
                    foreach (var l in billingEngine.LignesARecords.Where(p => !string.IsNullOrWhiteSpace(p.LOT_INFO)))
                    {
                        cmd.Parameters.Clear();
                        cmd.Parameters.AddWithValue("@id_art", l.ID_ARTICLE).SqlDbType = SqlDbType.Char;
                        cmd.Parameters.AddWithValue("@lib", l.LOT_INFO).SqlDbType = SqlDbType.Char;
                        cmd.Parameters.AddWithValue("@id_depot", billingEngine.PiedsARecord.ID_DEPOT).SqlDbType = SqlDbType.Char;
                        object ox = Api.ZselectDirect(cmd);
                        if (ox == null)
                        {
                            billingEngine.LastError = Api.LastError;
                            e.CancelSave = true;
                            return;
                        }
                        l.ID_LOT = ox.ToString();
                    }
                }
            }
        }

    }
}

De bewerking is als volgt : in MercatorPenguin scant de gebruiker het binnenkomende artikel en scant vervolgens het label van het lot in het gebied "Lot". Bij het opslaan zal MercatorPenguinServer door de verschillende regels van het document bladeren en de "lot_info" aan een bestaand lot koppelen. Als er geen lot wordt gevonden, wordt deze automatisch gemaakt en genummerd.


Overwegingen voor gerelateerde, samengestelde en gebundelde artikels

MercatorPenguin is compatibel met de volgende kenmerken :

en dit, recursief, tot 9 niveaus, zoals in Mercator Desktop. Het gebruik is echter iets anders. Het invoerscherm voor gerelateerde artikelen en dat voor set artikels wordt inderdaad weergegeven wanneer het ouderartikel wordt geselecteerd. De regels die overeenkomen met gerelateerde, gebonden en  setartikels worden echter alleen gemaakt na het klikken op de knop "Toevoegen" (lijn toevoegen). Hierdoor kan de hoeveelheid vooraf worden ingevoerd en wordt er dus rekening mee gehouden bij het aanmaken van deze lijnen.

Op het scherm voor het invoeren van gebonden items kunt u een hoeveelheid kiezen voor elk van de onderliggende items, terwijl u voor set-items een switch kunt gebruiken om een item voor kinderen al dan niet te selecteren.

ArtLienV2NL   ArtLienV3NL


Overwegingen over differentiatie van eenheden

In deze ontwikkelingsfase is deze functionaliteit niet compatibel met de differentiatie van eenheden. De applicatie werkt echter zonder een fout te produceren, maar negeert de conversiecoëfficiënten tussen de verschillende eenheden.