Anlegen von Normteilen im Artikelstamm

Allgemeine Diskussionen um die ERP Software AvERP

Moderator: SYNERPY

Antworten
mlang
Beiträge: 1
Registriert: Do Dez 08, 2005 5:26 pm

Anlegen von Normteilen im Artikelstamm

Beitrag von mlang »

Wir möchten unsere im Metallbaubetrieb verwendeten Normteile als Artikel anlegen. Da es mehrere Möglichkeiten gibt, sind wir uns nicht sicher, welches die bessere Methode ist.

Kann uns jemand aus Erfahrung sagen, wie die Normteile optimal hinsichtlich Stücklisten, Einkauf und Fertigung angelegt sein sollten?

Möglichkeit 1:
Artikel.Nr. M4x12 DIN912 8.8 blank
Artikel.Bez. Zylinderschraube

Möglichkeit 2:
Artikel.Nr. N123456
Artikel.Bez. Zylinderschraube M4x12 DIN912 8.8 blank

Möglichkeit 3: ...

Ist die Verwendung weiterer Felder (Matchcode, Sachmerkmale, DIN,...) sinnvoll?

Vielen Dank für die Hilfe
Zwitsch
Beiträge: 34
Registriert: Mi Mär 09, 2005 8:01 am

Beitrag von Zwitsch »

ich lehne "sprechende" Artikelnummern ab. Irgendwann gerät man an eine Grenze und hat eine Mischung aus "sprechenden" und "normalen" Artikelnumern im Materialstamm.

Wenn man im Bezeichnungsfeld die Texte so vergibt, dann hat man sehr gute Suchmöglichkeiten:

Skt-Schr.M10 x 12 DIN 933- 8
Skt-Schr.M12 x 16 DIN 933- 8


Gleiche gilt natürlich auch für Beilagscheiben, Muttern etc.
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Mit dem entsprechenden Code ist es in AvERP über die Sachmerkmale möglich, Artikelbezeichnungen (und ggf. auch -nummern) aus den Sachmerkmalen zu generieren.

Hier z.B. die Sachmerkmale
-Schraubenart
-Größe
-DIN
etc.
anlegen

und das System generiert dann immer in der gleichbleibenden Art und Weise die Artikelbezeichnung. Hier kann dann natürlich automatisch abgeprüft werden, ob es diesen Artikel schon in der Form gibt.
tskier
Beiträge: 5
Registriert: Mo Jul 03, 2006 1:43 pm

Beitrag von tskier »

Hallo,

genau an dieser Möglichkeit der automatischen Definition von Artikelbezeichnungen beiße ich mir seit Stunden die Zähne aus. Ich habe ein Sachmerkmals Template namens “Schrauben” angelegt, mit folgenden Einzelmerkmalen:

Schraubenart: Auswahlliste (“Innensechskantschraube=Iskt-Schr.”,“Sechskantschraube=Skt-Schr.”, etc)

Groesse: Auswahlliste (“M3=M3",”M4=M4" etc.)

Laege in mm: Zeichenkette

Aus diesen Merkmalen möchte ich eine Nomenklatur zur Vergabe der Artikelbezeichnung bilden, so dass Artikel z.B. wie folgt heißen:

Iskt-Schr.M3*30
Skt-Schr.M4*60
usw.

Ich kann die entsprechenden Merkmale zwar im Artikelstamm wählen, finde aber keine Möglichkeit, sie sprechend in die Artikelbezeichnung zu übernehmen. Wie geht das?

Danke im Voraus,

Thomas
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Dadurch, dass die Sachmerkmale dynamisch hinterlegt werden müssen, muss dies über ein Skript bei den Sachmerkmalen (Maske "Template-Einzelmerkmale") hinterlegt werden.

Hier ein Beispiel:

Code: Alles auswählen

begin
  //DebugOn := true;
  bChange := false;
  sWert0 := 'r';
  sWert1 := '';
  sWert2 := '';
  sWert3 := '';
  sWert4 := '';
  sWert5 := '';
  sWert6 := '';
  sWert7 := '';
  sWert8 := '';
  sWert9 := '';
  sWert10 := '';
  sWert11 := '';


  mWert0 := '';
  mWert1 := '';
  mWert2 := '';
  mWert3 := '';
  mWert4 := '';
  mWert5 := '';
  mWert6 := '';
  mWert7 := '';
  mWert8 := '';
  mWert9 := '';
  mWert10 := '';
  mWert11 := '';


  nBSA_ID := AsInteger(Self.o_MyQuery.FieldByName('ID'));
  MyStP := FrmData.StP_Universal;
  MyStP.StoredProcName := 'P_BPROPBSA_LESEN';
  MyStP.ParamByName('BSA_ID',nBSA_ID);

  oStr := Self.StringGrid1;
  for i := 0 to oStr.RowCount-1 do
  begin
     // Größe
     if oStr.ReadCell(0,i) = '2' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        MyStP.ParamByName('BPROP_ID',2);
        MyStP.ParamByName('WERTART',2);
        MyStP.Execute;
        sWert1 := AsString(MyStP.FieldByName('INHALT'));
        mWert1 := oStr.ReadCell(8,i);
     end
     else
     // Dessin
     if oStr.ReadCell(0,i) = '4' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        MyStP.ParamByName('BPROP_ID',4);
        MyStP.ParamByName('WERTART',1);
        MyStP.Execute;
        sWert2 := AsString(MyStP.FieldByName('INHALT'));
        mWert2 := oStr.ReadCell(8,i);
     end
     else
     // Qualität
     if oStr.ReadCell(0,i) = '3' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        MyStP.ParamByName('BPROP_ID',3);
        MyStP.ParamByName('WERTART',1);
        MyStP.Execute;
        sWert3 := AsString(MyStP.FieldByName('INHALT'));
        mWert3 := oStr.ReadCell(8,i);
     end
     else
     // FarbNr
     if oStr.ReadCell(0,i) = '5' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        MyStP.ParamByName('BPROP_ID',5);
        MyStP.ParamByName('WERTART',1);
        MyStP.Execute;
        sWert4 := AsString(MyStP.FieldByName('INHALT'));

        MyStP.ParamByName('BPROP_ID',5);
        MyStP.ParamByName('WERTART',2);
        MyStP.Execute;
        sWert5 := AsString(MyStP.FieldByName('INHALT'));
        mWert4 := oStr.ReadCell(8,i);
     end
     else
     // Farbbezeichnung
     if oStr.ReadCell(0,i) = '4' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        MyStP.ParamByName('BPROP_ID',5);
        MyStP.ParamByName('WERTART',2);
        MyStP.Execute;
        sWert5 := AsString(MyStP.FieldByName('INHALT'));
        mWert5 := oStr.ReadCell(8,i);
     end;
     // Besonderheit
     if oStr.ReadCell(0,i) = '10' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        sWert6 := oStr.ReadCell(8,i);
        mWert6 := oStr.ReadCell(8,i);
     end;
     // Ausrüstungsnummer
     if oStr.ReadCell(0,i) = '6' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        MyStP.ParamByName('BPROP_ID',6);
        MyStP.ParamByName('WERTART',1);
        MyStP.Execute;
        sWert7 := AsString(MyStP.FieldByName('INHALT'));
        mWert7 := oStr.ReadCell(8,i);
     end;
     // Konfektionsart
     if oStr.ReadCell(0,i) = '8' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        MyStP.ParamByName('BPROP_ID',8);
        MyStP.ParamByName('WERTART',2);
        MyStP.Execute;
        sWert8 := AsString(MyStP.FieldByName('INHALT'));
        mWert8 := oStr.ReadCell(8,i);
     end;
     // Wahl
     if oStr.ReadCell(0,i) = '7' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        MyStP.ParamByName('BPROP_ID',7);
        MyStP.ParamByName('WERTART',2);
        MyStP.Execute;
        sWert9 := AsString(MyStP.FieldByName('INHALT'));
     end;
     // Verpackungsart
     if oStr.ReadCell(0,i) = '9' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        MyStP.ParamByName('BPROP_ID',9);
        MyStP.ParamByName('WERTART',2);
        MyStP.Execute;
        sWert10 := AsString(MyStP.FieldByName('INHALT'));
        mWert10 := oStr.ReadCell(8,i);
     end;
     // Geschäftsfeld
     if oStr.ReadCell(0,i) = '1' then
     begin 
        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
        mWert11 := oStr.ReadCell(8,i);
     end;
  end;
  if bChange then
  begin
    // Neue Artikelbezeichnung generieren
    M := Self.o_MyQuery.FieldByName('ARTBEZ');
    N := Self.o_MyQuery.FieldByName('MASKENKEY');

    swert4 := copy(swert4,1,4) + '/' + copy(swert4,5,2);
    
    if (sWert6 <> '') then
      trenner1 := '- '
    else
      trenner1 := '';

  if (sWert5 = 'weiß') then
    sWert5 := ''
  else
    sWert5 := sWert5 + ' ';

    // Artikelbezeichnung und Artikelnummer
    s1 := sWert0 + sWert1 +' '+ sWert2 +'/'+ sWert3 +' '+ sWert4 + ' ' + sWert5 + sWert6;
    s2 := mWert11 + mWert3 + mWert1 + mWert2 + mWert4  + '000000000';

    M.AsString := s1;
    N.AsString := s2;


    // Mengeneinheiten vorbelegen
    M := Self.o_MyQuery.FieldByName('BMENG_ID_ME_E');
    M.AsInteger := 2;

    M := Self.o_MyQuery.FieldByName('BMENG_ID_ME_V');
    M.AsInteger := 2;

    M := Self.o_MyQuery.FieldByName('BMENG_ID_ME_L');
    M.AsInteger := 2;

    M := Self.o_MyQuery.FieldByName('BMENG_ID_ME_F');
    M.AsInteger := 2;

    M := Self.o_MyQuery.FieldByName('BMENG_ID_PE_E');
    M.AsInteger := 2;

    M := Self.o_MyQuery.FieldByName('BMENG_ID_PE_V');
    M.AsInteger := 2;

    // Charge JN = 'N'
    M := Self.o_MyQuery.FieldByName('CHARGE_JN');
    M.AsString := copy(FrmData.sJaNein,1,1);
  end;
end;

Hier die Erklärung:

Code: Alles auswählen

 // Größe
Wenn die ID des Sachmerkmals 2 ist,

Code: Alles auswählen

     if oStr.ReadCell(0,i) = '2' then
     begin
und der Wert verändert wurde (wenn es den Artikel schon gab, aber dieser bearbeitet wurde).

Code: Alles auswählen

        if oStr.ReadCell(7,i) <> oStr.ReadCell(8,i) then bChange := true;
Dann wird die Prozedur "P_BPROPBSA_LESEN" ausgeführt. Diese wurde am Anfang des Codes definiert. Die Prozedur bringt entweder den Wert vor oder nach dem "=" zurück, also entweder "Innensechskanntschraube" oder "Iskt-Schr.". (Übrigens: das "=" muss nicht vergeben werden, "M3=M3" macht nicht wirklich Sinn, es sollte hier "M3","M4" etc. eingegeben werden.)

Code: Alles auswählen

        MyStP.ParamByName('BPROP_ID',2);
        MyStP.ParamByName('WERTART',2);
        MyStP.Execute;
Jetzt wird der Rückgabewert der Prozedur in die Variable "sWert1" eingelesen.

Code: Alles auswählen

        sWert1 := AsString(MyStP.FieldByName('INHALT'));
        mWert1 := oStr.ReadCell(8,i);
     end
Am Ende wird der Code dann in der gewünschten Reihenfolge zusammengebaut und der Artikelnummer, bzw. Artikelbezeichnung zugewiesen.

Code: Alles auswählen

    // Artikelbezeichnung und Artikelnummer
    s1 := sWert0 + sWert1 +' '+ sWert2 +'/'+ sWert3 +' '+ sWert4 + ' ' + sWert5 + sWert6;
    s2 := mWert11 + mWert3 + mWert1 + mWert2 + mWert4  + '000000000';

    // Neue Artikelbezeichnung generieren
    M := Self.o_MyQuery.FieldByName('ARTBEZ');
    N := Self.o_MyQuery.FieldByName('MASKENKEY');

    M.AsString := s1;
    N.AsString := s2;
Wie schon gesagt, muss hier (leider) etwas programmiert werden. Aber da es sich eigentlich nur um Kopieren und Ergänzen handelt, sollte das nicht allzu schwer sein.
tskier
Beiträge: 5
Registriert: Mo Jul 03, 2006 1:43 pm

Beitrag von tskier »

Hallo Admin,

danke für den Tipp. Ich arbeite mich erst seit 1 Wo. in Averp ein, und fühle mich noch ausserstande, Scripte oder Programmänderungen zu nutzen. Dies wird aber hoffentlich kommen.

Super Support

Thomas
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Dankeschön! :)

Wie schon gesagt handelt es sich hierbei leider um ein komplexeres Thema. Zum Einstieg haben Sie hier eine der ganz wenigen Stellen erwischt, bei der man zu Skripten greifen muss. Aber auch das ist bald kein Problem mehr :)
tskier
Beiträge: 5
Registriert: Mo Jul 03, 2006 1:43 pm

Beitrag von tskier »

Sachmerkmale

Bei der Nutzung der (sehr angenehmen) Sachmerkmalen ist mir folgendes aufgefallen. Vergibt man ein Einzelmerkmal mit Auswahlbox, z.B. Schraubenart (Zylinderkopfschrauben, Innensechskantschrauben...etc.) und hinterlegt dieses Sachmerkmal in einem Artikel, so lassen sich die Einträge der Auswahlbox nicht mehr ändern (z.B. Tippfehler) oder durch Einfügen erweitern. Man kann allerdings die Einträge der Auswahl Box am Ende ergänzen..

Entfernt man dieses Einzelmerkmal temporär aus dem Artikel, so hat man wieder komplette Kontrolle über die Auswahlbox (ändern, einfügen und ergänzen).

Gibt es eine Möglichkeit, die Sachmerkmal Auswahleinträge zu bearbeiten, ohne das Sachmerkmal vorher aus Hunderten von Artikeln zu entfernen (und danach wieder bei Null zu beginnen)? Ohne diese Möglichkeit müsste man ja eine so sorgfältige Sachmerkmalsdefinition erstellen, die ohne Notwendigkeit der Änderung oder Ergänzung die nächsten 10 Jahre übersteht.

Danke im Voraus

Thomas
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Die Sachmerkmale sind auch als Unterprogramm zum Artikel hinterlegt. Hier kann man dann per UPDATE aus allen "Seknkopfschrauben" "Senkkopfschrauben" machen. Bei den Definitionen muss das natürlich auch einmalig korrigiert werden.
jo
Beiträge: 76
Registriert: Mi Jul 12, 2006 5:31 pm

Beitrag von jo »

admin hat geschrieben:Dankeschön! :)

Aber auch das ist bald kein Problem mehr :)
finde die Funktion leider nicht.
AVERP 05/2007

Grüße
Jo
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Welche Funktion?
jo
Beiträge: 76
Registriert: Mi Jul 12, 2006 5:31 pm

Beitrag von jo »

....
Zuletzt geändert von jo am Di Mai 04, 2010 10:37 pm, insgesamt 1-mal geändert.
admin
Site Admin
Beiträge: 2673
Registriert: Di Feb 10, 2004 5:48 am
Wohnort: Bayreuth

Beitrag von admin »

Nein, nachdem der oben gepostete Quellcode eingespielt und angepasst ist, wird automatisch bei der Eingabe die Artikelnummer- bzw. -bezeichnung angepasst.
Antworten