wir arbeiten sehr viel mit Auswahllisten in den Artikelsachmerkmalen, eigentlich eine tolle Sache, aber meine Kollegen bemängeln die sehr umständliche Handhabung in Angeboten. Ich beschreibe mal nachfolgend anhand der neuesten Demo-DB, was damit gemeint ist:

Im Artikelstamm sind im Register 6 die Sachmerkmale definiert (Farbe,Motor, PS als Auswahlfelder sowie sonstige Informationen als Textfeld). Diese Sachmerkmale sollen in Angebotspositionen evtl. angepasst werden., also Angebot erstellt und nun befinden wir uns im Einfügemodus der ersten Position:

ich habe die Artikelnummer (AU01) ins Feld ArtikelNr. eingegeben und das Feld mit Tab verlassen, Menge 1 und der Preis wird vorgeschlagen, soweit gut. Allerdings werden im Register 2 keine Sachmerkmale angezeigt. Die sollte aber jetzt hier schon vorgeschlagen werden, damit ich diese im Einfügemodus bereits anpassen kann.
Es ist aber so, dass ich die Position erst speichern muss:

Mit dem Speichern werden nun die Sachmerkmale angezeigt, jetzt kann ich sie anpassen. Aber: Klicke ich nun in ein Sachmerkmalfeld, passiert rein garnichts, die Auswahlliste wird nicht aktiviert. Ich muss also entweder doppelt in ein Feld klicken, um den Bearbeitungsmodus zu aktivieren (oder den Bleistift anklicken), um dann endlich die Anpassung in den Auswahllisten durchführen zu können. Also zusammengefasst: Position anlegen, abspeichern, nochmal in den Bearbeitungsmodus schalten und dann Sachmerkmale anpassen. Das ist auch nach meiner Meinung sehr umständlich und könnte besser sein.
Ich habe mir also das OnExit-Script des Feldes ArtikelNr. im Designer mal angesehen (FRMV_BAUF_A_PO) und war erstaunt, dort wurde bereits eine Vorbelegung der Sachmerkmale angedacht und programmiert:
Code: Alles auswählen
Begin
// Feldvorbelegung Sachmerkmale
// LS 28.01.2008 RW
// Wenn Insert or Edit ,
// dann prüf BSAKUNDE nach BPROPT ID als Vorlage für Sachmerkmale
// DebugOn := True;
wo := 'Proc00036';
iBSA_ID := AsInteger(q_1.FieldByName('BSA_ID_ARTNR'));
iBKUNDE_ID := AsInteger(q_1.FieldByName('BAUF_BKUNDE_ID_KUNR'));
if (((q_1.state = dssInsert) or (q_1.state = dssEdit)) and
(iBSA_ID > 0) and (iBKUNDE_ID > 0)) then
begin
MySQL := frmData.Universal;
MySQL.SQL.Text := 'SELECT B.BPROPT_ID '+
'FROM BSAKUNDE B '+
'WHERE B.BKUNDE_ID = :BKUNDE_ID AND ' +
' B.BSA_ID_LINKKEY = :BSA_ID ';
MySQL.ParamByName('BKUNDE_ID',iBKUNDE_ID);
MySQL.ParamByName('BSA_ID',iBSA_ID);
MySQL.open();
iBPROPT_ID := AsInteger(MySQL.FieldByName('BPROPT_ID'));
MySQL.close();
// Wenn BPROPT_ID gefunden dann die Feldvorbelegung machen
if (iBPROPT_ID > 0) then
begin
M := q_1.FieldByName('BPROPT_ID');
M.AsInteger := iBPROPT_ID;
q_1.RelationIDFeld('BPROPT_ID');
Sachmerkmale('R','TabSheet_2',LB_ParaSachmerkmale.Caption);
end;
end;
End;Ich muss also im Artikelstamm Unterprogramm "Kundenartikel.Nr.Bez" einen Datensatz anlegen, den Kunden zuweisen und das Template (welches ja im Artikelstamm schon hinterlegt ist) nochmals zuweisen.
Das macht nach meinem Verständnis dann Sinn, wenn ich für unterschiedliche Kunden, unterschiedliche Sachmerkmale vordefiniert habe.
Nun habe ich den Code soweit ergänzt, dass -wenn im besagten Unterprogramm ein Template für einen Kunden eingetragen wurde- dann dieses genommen wird und ansonsten die Templatevorlage im Artikelstamm gezogen wird, so macht das die Sache rund wir ich finde:
Code: Alles auswählen
Begin
// Feldvorbelegung Sachmerkmale
// LS 28.01.2008 RW
// Wenn Insert or Edit ,
// dann prüf BSAKUNDE nach BPROPT ID als Vorlage für Sachmerkmale
// DebugOn := True;
wo := 'Proc00036';
iBSA_ID := AsInteger(q_1.FieldByName('BSA_ID_ARTNR'));
iBKUNDE_ID := AsInteger(q_1.FieldByName('BAUF_BKUNDE_ID_KUNR'));
if (((q_1.state = dssInsert) or (q_1.state = dssEdit)) and
(iBSA_ID > 0) and (iBKUNDE_ID > 0)) then
begin
MySQL := frmData.Universal;
MySQL.SQL.Text := 'SELECT B.BPROPT_ID '+
'FROM BSAKUNDE B '+
'WHERE B.BKUNDE_ID = :BKUNDE_ID AND ' +
' B.BSA_ID_LINKKEY = :BSA_ID ';
MySQL.ParamByName('BKUNDE_ID',iBKUNDE_ID);
MySQL.ParamByName('BSA_ID',iBSA_ID);
MySQL.open();
iBPROPT_ID := AsInteger(MySQL.FieldByName('BPROPT_ID'));
MySQL.close();
if (iBPROPT_ID = 0) then
begin
MySQL :=frmData.Universal;
MySQL.SQL.Text := 'SELECT C.BPROPT_ID '+
'FROM BSA C '+
'WHERE C.ID = :BSA_ID ';
MySQL.ParamByName('BSA_ID',iBSA_ID);
MySQL.open();
iBPROPT_ID := AsInteger(MySQL.FieldByName('BPROPT_ID'));
MySQL.close();
end;
// Wenn BPROPT_ID gefunden dann die Feldvorbelegung machen
if (iBPROPT_ID > 0) then
begin
M := q_1.FieldByName('BPROPT_ID');
M.AsInteger := iBPROPT_ID;
q_1.RelationIDFeld('BPROPT_ID');
Sachmerkmale('R','TabSheet_2',LB_ParaSachmerkmale.Caption);
end;
end;
End;
Dies ist aber noch nicht ganz perfekt: es werden nur die Merkmalsbezeichnungen eingefügt, nicht aber die Vorbelegung der Inhalte.
Aber genau die möchte ich vorgeschlagen bekommen, also genauso, als wenn ich den Datensatz speichern würde.
Also im Einfügemodus nach dem Verlassen des Artikelnummernfeldes die Sachmerkmale mit Inhalte wie im Artikelstamm hinterlegt.
Warum : Weil es ja sein kann, dass ich mich für die Standardvorbelegung entscheide und nicht anpassen muss und außerdem weiss ich so ja nicht, was im Textfeld des Artikelstammes vorbelegt wurde.
Ich hoffe , ich habe unsere Problematik ausführlich beschrieben, ich benötige also nur noch eine Lösung, wie die Vorbelegung der Sachmerkmale komplett beim OnExit durchgeführt wird.
Besten Dank und
viele Grüße
Thomas