[gelöst] CC: Bestellung, Artikelliste nur mit best. Artikeln

6. Mai 2013 14:01

Hallo zusammen,

es mag je sein, dass ich blind bin, aber kann man irgendwie einstellen, dass bei einer Bestellung (Form 50) im Subform (54) nur die Artikel des Kreditors angezeigt werden?

Kann man da irgendwie eine Filter setzen? Evtl. auch variabel, so dass der Anwender entscheiden kann ob die Artikelliste gefiltert werden soll oder nicht?

Volker
Zuletzt geändert von vsnase am 7. Mai 2013 15:54, insgesamt 1-mal geändert.

Re: CC: Bestellung, Artikelliste nur mit best. Artikeln

6. Mai 2013 14:07

Möchtest du den Lookup auf Feld "Nr." einschränken?

Re: CC: Bestellung, Artikelliste nur mit best. Artikeln

6. Mai 2013 14:24

So hätte man es auch sagen können. Ja, genau das will ich. Geht das im Standard oder darf ich da was erfinden?

Re: CC: Bestellung, Artikelliste nur mit best. Artikeln

6. Mai 2013 14:34

vsnase hat geschrieben:Geht das im Standard oder darf ich da was erfinden?

Per Einrichtung geht das nicht, das wird nämlich realisiert über Tabelle 39 -> "No." -> Eigenschaft TableRelation in Kombination mit Tabelle 27 -> Eigenschaft LookupFormID.

Wenn du die TableRelation änderst (sofern deine Anforderung überhaupt über einen einfachen Filter abbildbar ist), gilt das für alle Benutzer und absolut niemand kann dann mehr einen Artikel auswählen, der nicht in "das Raster" passt.

Deutlich flexibler bist du, wenn du den OnLookup-Trigger des Tabellefeldes "No." ausprogrammierst.

Re: CC: Bestellung, Artikelliste nur mit best. Artikeln

7. Mai 2013 12:31

Ich wollte jetzt im OnLookup-Trigger von No. einen Filter ein bauen.

Ich scheitere momentan daran, dass ich die Tabelle Item filtern muss, aber auf den Inhalt der Tabelle Item Vendor.

In reinem SQL-Code wäre das einfach:
Code:
SELECT     dbo.[CRONUS AG$Item].*
FROM         dbo.[CRONUS AG$Item] INNER JOIN
                      dbo.[CRONUS AG$Item Vendor] ON dbo.[CRONUS AG$Item].No_ = dbo.[CRONUS AG$Item Vendor].[Item No_]
WHERE     (dbo.[CRONUS AG$Item Vendor].[Vendor No_] = '33')

aber in C/AL bekomme ich es nicht hin.

Fällt jemand im Standard etwas ein , das ähnlich ist? Oder jede andere Lösung natürlich gerne auch.

Volker

Re: CC: Bestellung, Artikelliste nur mit best. Artikeln

7. Mai 2013 14:59

Kannst Du nicht die ItemVendor Tabelle als Grundlage nehmen und nur die Item No. als Wert in das Feld No. validieren?

Gibt es bei dir pro Artikel immer nur einen Vendor? Wenn ja, dann könnte man das über Feld 31 in der Item Tabelle abbilden.

Wenn alles nicht klappt im OnLookup eine temporären Item Record mit allen Artikeln füllen die im Item Vendor angegeben sind und die Page dann mit dem Temp Record öffnen.

Re: CC: Bestellung, Artikelliste nur mit best. Artikeln

7. Mai 2013 15:15

Hi Jan,

ich wollte den Standard ja nicht ganz umbauen.

Es geht um Bestellungen (Form 50, 54 und 31). Bei Lookup auf die Item No in Form 54 sollen nur die Artikel in Form 31 angezeigt werden, für die der Kreditor (aus Form 50) als Lieferant festgelegt ist. Tabelle Item allein scheidet aus, da die Artikel z. T. bei mehren Lieferanten bestellt werden können.

JanGD hat geschrieben:Wenn alles nicht klappt im OnLookup eine temporären Item Record mit allen Artikeln füllen die im Item Vendor angegeben sind und die Page dann mit dem Temp Record öffnen.
Du meinst Zeilenweise zusammenbasteln?

Volker

Re: CC: Bestellung, Artikelliste nur mit best. Artikeln

7. Mai 2013 15:54

So ich hab es.

In Form 31 eine Funktion mit folgendem Code-Fragment erstellen und gut ist.

Code:
VendorItems.SETRANGE("Vendor No.", '33');
VendorItems.FIND('-');
REPEAT
Rec.GET(VendorItems."Item No.");
Rec.MARK(TRUE);
UNTIL VendorItems.NEXT=0;
Rec.MARKEDONLY(TRUE);


Das ist natürlich noch nicht ganz ordentlich, aber als Grundgerüst tut es das was es soll.

Volker

Re: [gelöst] CC: Bestellung, Artikelliste nur mit best. Arti

7. Mai 2013 16:52

vsnase hat geschrieben:
Code:
VendorItems.FIND('-');
REPEAT



Obwohl hier ja schon etliche Grabenkrige darum geführt wurden, aber ich würd kein find('-') vor ein repeat schreiben

Re: [gelöst] CC: Bestellung, Artikelliste nur mit best. Arti

8. Mai 2013 07:38

Stattdessen nutzt Du was?

Re: [gelöst] CC: Bestellung, Artikelliste nur mit best. Arti

8. Mai 2013 08:14

Markus Merkl hat geschrieben:
vsnase hat geschrieben:
Code:
VendorItems.FIND('-');
REPEAT



Obwohl hier ja schon etliche Grabenkrige darum geführt wurden, aber ich würd kein find('-') vor ein repeat schreiben


Wenn er tausende von ItemVendor-Einträgen hat pro Vendor, ist das the way to go.
findset vorzugsweise dann, wenn man innerhalb der Anzahl Datensatz-Set Einstellung bleibt.

Re: [gelöst] CC: Bestellung, Artikelliste nur mit best. Arti

8. Mai 2013 08:44

vsnase hat geschrieben:Stattdessen nutzt Du was?


Jörg hat das hier <http://www.msdynamics.de/viewtopic.php?f=40&t=20074> excellent beschrieben - besser könnt ichs nicht 8-)

Re: [gelöst] CC: Bestellung, Artikelliste nur mit best. Arti

10. Mai 2013 08:59

Mal komplett:

Form 31 Item List:
Globals:
VendorItems Record Tabelle 99 Item Vendor
AllItems Record Tabelle 27 Item
Code:
    PROCEDURE ShowBlockedItems@1000000000(Blocked@1000000000 : Boolean);
    BEGIN
      IF NOT Blocked THEN BEGIN
      Rec.SETRANGE(Blocked,FALSE);
      END;
    END;

    PROCEDURE OnlyCreditorNo@1000000001(No@1000000000 : Code[20]);
    BEGIN
      IF No <> '' THEN BEGIN
        VendorItems.SETRANGE("Vendor No.", No);
        AllItems.SETRANGE("Vendor No.",No);

        IF AllItems.FIND('-') THEN BEGIN
          REPEAT
            Rec.GET(AllItems."No.");
            Rec.MARK(TRUE);
          UNTIL AllItems.NEXT=0;
        END;

        IF VendorItems.FIND('-') THEN BEGIN
          REPEAT
             Rec.GET(VendorItems."Item No.");
              Rec.MARK(TRUE);
          UNTIL VendorItems.NEXT=0;
        END;

        Rec.MARKEDONLY(TRUE);

     END;
    END;


Form 54 Purchase Order Subform:
Globals:
ShowBlockedItems Boolean
CurrCreditorNo Code(20)

Code:
    PROCEDURE SetCurrCreditor@1000000000(BuyFromVendorNo@1000000000 : Code[20]);
    BEGIN
        CurrCreditorNo:=BuyFromVendorNo;
    END;

TRIGGER No. OnLookup
CASE Type OF
  Type::" ":
    BEGIN
      StandardTextForm.LOOKUPMODE:=TRUE;
      IF StandardTextForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
        StandardTextForm.GETRECORD(StandardTextRec);
        VALIDATE("No.", StandardTextRec.Code);
      END;
    END;
  Type::"G/L Account":
    BEGIN
      GLAccountForm.LOOKUPMODE:=TRUE;
      IF GLAccountForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
        GLAccountForm.GETRECORD(GLAccountRec);
        VALIDATE("No.", GLAccountRec."No.");
      END;
    END;
  Type::Item:
  BEGIN
      ItemForm.ShowBlockedItems(ShowBlockedItems);
      ItemForm.OnlyCreditorNo(CurrCreditorNo);
      ItemForm.LOOKUPMODE:=TRUE;
      IF ItemForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
      ItemForm.GETRECORD(ItemRec);
      VALIDATE("No.",ItemRec."No.");
      END;
  END;
//  Für Sales muss auch Resource berücksichtigt werden.
//  Type::Resource:
//    BEGIN
//      ResourceForm.LOOKUPMODE:=TRUE;
//      IF ResourceForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
//        ResourceForm.GETRECORD(ResourceRec);
//        VALIDATE("No.", ResourceRec."No.");
//      END;
//    END;
  Type::"Fixed Asset":
    BEGIN
      FixedAssetForm.LOOKUPMODE:=TRUE;
      IF FixedAssetForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
        FixedAssetForm.GETRECORD(FixedAssetRec);
        VALIDATE("No.", FixedAssetRec."No.");
      END;
    END;
  Type::"Charge (Item)":
    BEGIN
      ChargeItemForm.LOOKUPMODE:=TRUE;
      IF ChargeItemForm.RUNMODAL=ACTION::LookupOK THEN BEGIN
        ChargeItemForm.GETRECORD(ChargeItemRec);
        VALIDATE("No.", ChargeItemRec."No.");
      END;
    END;
 END;


Form 50 Purchase Order:
Code:
TRIGGER Buy-From Vendor No OnAfterValidate
CurrForm.PurchLines.FORM.SetCurrCreditor(Rec."Buy-from Vendor No.");

    LOCAL PROCEDURE UpdateInfoPanel@2();
    VAR
      DifferBuyFromPayTo@1000 : Boolean;
    BEGIN
      DifferBuyFromPayTo := "Buy-from Vendor No." <> "Pay-to Vendor No.";
      CurrForm.PurchHistoryBtn.VISIBLE := DifferBuyFromPayTo;
      CurrForm.PayToCommentPict.VISIBLE := DifferBuyFromPayTo;
      CurrForm.PayToCommentBtn.VISIBLE := DifferBuyFromPayTo;
      CurrForm.PurchHistoryBtn1.VISIBLE := PurchInfoPaneMgmt.DocExist(Rec,"Buy-from Vendor No.");
      CurrForm.PurchLines.FORM.SetCurrCreditor(Rec."Buy-from Vendor No.");
      IF DifferBuyFromPayTo THEN
        CurrForm.PurchHistoryBtn.VISIBLE := PurchInfoPaneMgmt.DocExist(Rec,"Pay-to Vendor No.")
    END;


In der Subform habe ich eine neue Checkbox "Auch geblockte Artikel anzeigen", so dass bei Lookup alle Artikel angezeigt werden. Alternativ kann man den Filter über "Alle Anzeigen (Umschalt+Strg+F7)" deaktivieren. Das ganze ist natürlich für ähnliche Forms (Purchase Quote, Sales Quote, Sales Order, ...) analog zu machen. Bei Salse XXXX muss man als weiteren Typ "Resourece" berücksichtigen.

Volker