AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

dynamisch Records ansprechen

Offene Frage von "Blup"
Ein Thema von Hackerl · begonnen am 2. Aug 2012 · letzter Beitrag vom 3. Aug 2012
Antwort Antwort
Seite 1 von 2  1 2   
Hackerl

Registriert seit: 8. Nov 2011
Ort: Darmstadt
10 Beiträge
 
Delphi 11 Alexandria
 
#1

dynamisch Records ansprechen

  Alt 2. Aug 2012, 16:10
Hallo,

ich habe in meinem Programm zum Auslesen von AD-Infos eine Frage zum 'dynamischen' ansprechen von Records.

Zuerst habe ich ein Record-Type definiert:
Code:
   type TADUser = record
     cn,name,sn,givenName,displayName: String;
   end;
Bei der Abfrage des AD kann ich folgende Infos ermitteln:
Code:
var
   ADUser: TADUser;
   displayName: String;

Begin
 ...
   CONNECTIONString := 'select cn,givenname,displayname,sn,objectsid from '+Domain+' where objectclass='+'''user'''+' and objectclass<>'+'''computer'' ORDER by cn';
 ...
   Typ := rs.fields[2].type;
   Name := rs.fields[2].name;
   displayName:= rs.fields[2].Value;
Statt der Variable 'displayName' möchte ich in die Records 'ADUser.*' in einerhalb einer Schleife schreiben.
In etwa so:
Code:
   if not VarIsNull(rs.Fields[0].Value) then
      Name := rs.fields[2].name; // name des AD-Feldes
      ADUser.(rs.fields[2].name) := rs.fields[2].Value; //Wert des AD-Feldes
...
Ist so etwas möglich?

Gruß
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: dynamisch Records ansprechen

  Alt 2. Aug 2012, 16:19
Herzlich Willkommen in der DP

Bitte liefere doch mal alle relevanten Stellen deines Codes.

Was genau ist den rs?

Ja, es ist sicherlich möglich das in einer Schleife abzuarbeiten.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#3

AW: dynamisch Records ansprechen

  Alt 2. Aug 2012, 16:37
In etwa so:
Code:
   if not VarIsNull(rs.Fields[0].Value) then
      Name := rs.fields[2].name; // name des AD-Feldes
      ADUser.(rs.fields[2].name) := rs.fields[2].Value; //Wert des AD-Feldes
...
Ist so etwas möglich?
[/QUOTE]

Ja aber wofür soll es gut sein, da rs ja alle Daten enthält?

Aber was hat das mit TADUser zu tun?

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.473 Beiträge
 
Delphi 12 Athens
 
#4

AW: dynamisch Records ansprechen

  Alt 2. Aug 2012, 17:41
Ich vermute er sucht so etwas:
Delphi-Quellcode:
type
  PString = ^String;

  TADUser = record
  private
    function FindField(const AFieldName: string): PString;
    procedure SetField(const AFieldName, AFieldValue: string);
    function GetField(const AFieldName: string): string;
  public
    cn,name,sn,givenName,displayName: string;
    property Field[const AFieldName: string]: string read GetField write SetField; default;
  end;

function TADUser.FindField(const AFieldName: string): PString;
begin
  if AnsiSameText(AFieldName, 'givenName') then
    Result := @givenName
  else if AnsiSameText(AFieldName, 'displayName') then
    Result := @displayName
  else
    Result := nil;
end;

procedure TADUser.SetField(const AFieldName, AFieldValue: string);
var
  lField: PString;
begin
  lField := FindField(AFieldName);
  if Assigned(lField) then
    lField^ := AFieldValue;
end;

function TADUser.GetField(const AFieldName: string): string;
var
  lField: PString;
begin
  lField := FindField(AFieldName);
  if Assigned(lField) then
    Result := lField^
  else
    Result := '';
end;

var
  ADUser: TADUser;

begin
  ADUser['givenName'] := 'Max Mayer';
end;
Sollte ab Delphi 2007 funktionieren.
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#5

AW: dynamisch Records ansprechen

  Alt 2. Aug 2012, 17:44
*autsch* Nun habe ich gerafft, was gewünscht wird... Nun ja, Stichwort ist hier ganz klar RTTI. Interessant wäre hier aber noch zu wissen, welche Delphi-Version du nutzt?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: dynamisch Records ansprechen

  Alt 2. Aug 2012, 17:50
Gefällt!
Wenn das aufgebohrte Record noch nicht zur Verfügung steht, sollte man es eigentlich auch mit einer Klasse hinbekommen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Hackerl

Registriert seit: 8. Nov 2011
Ort: Darmstadt
10 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: dynamisch Records ansprechen

  Alt 3. Aug 2012, 08:27
Hallo,

erst einmal herzlichen Dank für die schnellen antworten!
Ich bin relativ neu in Delphi und arbeite mit der Version XE2.

Zum besseren Verständnis hier noch einmal ein ausführlicherer Code Ausschnitt:
Delphi-Quellcode:
type TADUser = record
  cn,name,sn,givenName,displayName,department,company: String;
  streetAddress,l,telephoneNumber,userPrincipalName: String;
  mail,createTimeStamp,objectSid,distinguishedName: String;
  objectGUID,lastLogon,pwdLastSet,badPasswordTime: String;
end;

...
var
  ADUser: TADUser;
...

function read_ADFields(OBJECTClass):ADUser;
var
  rs, conn, com: Variant;
  DOMAIN: String;
  count: Integer;

begin
  DOMAIN := '''LDAP://dc=xx,dc=xx-xxxxxxxxx,dc=de''';

  CoInitialize(nil);
  try
    conn := CreateOleObject('ADODB.Connection');
    com := CreateOleObject('ADODB.Command');
    conn.Provider := 'ADsDSOObject';
    conn.open;

    com.ActiveConnection := conn;
    Com.CommandText := 'select cn,givenname,displayname,sn from '+Domain+' where objectclass='+''''+OBJECTClass+''''+' and objectclass<>'+'''computer'' ORDER by cn';
    com.Properties['Page Size'] := 10;
    Com.Properties['Timeout'] := 600;
    Com.Properties['Cache Results'] := False;
    Com.Properties['Size Limit'] := 200;
    rs := COm.Execute;

    count := 0;
    While Not rs.EOF do
    begin

    if not VarIsNull(rs.Fields[0].Value) then
    begin   
        [COLOR="Red"]ADUser.[B](rs.fields[1].name)[/B] := rs.fields[1].Value;[/COLOR]
   inc(count,1);
    end;


    rs := NULL;
  finally
    CoUninitialize;
    com := NULL;
    conn.Close;
    conn := NULL;

  end;
end;
Meine Frage bezieht sich auf die rot geschriebene Zeile:
Ich definiere ein Record mit dem Namen TADUser und ddefinierten Feldern, die namentlich auch im AD
existieren. Nach meiner AD-Abfrage möchte ich innerhalb einer Schleife die Werte aus den AD-Feldern
in die zugehörigen Recordfelder schreiben. Wie bringe ich Delphi bei, dass die AD-Werte
z.B. aus displayName nach 'ADUser.displayName' geschrieben werden.

@Blup
Dein Code ist für einen Anfänger wie mich ein verdammt harter Toback!
  Mit Zitat antworten Zitat
Hackerl

Registriert seit: 8. Nov 2011
Ort: Darmstadt
10 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: dynamisch Records ansprechen

  Alt 3. Aug 2012, 08:31
UUPS!
Innerhalb des Code-Abschnitts gibt es keinen roten und fetten Text!
Hier noch einmal die Zeile ohne HTML-Code:
   ADUser.(rs.fields[1].name) := rs.fields[1].Value;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.463 Beiträge
 
Delphi 12 Athens
 
#9

AW: dynamisch Records ansprechen

  Alt 3. Aug 2012, 09:06
Jetz mal ehrlich: als Anfäger würde ich in diesem Fall von der empfohlenen RTTI-Lösung die Finger lassen und das Ganze stracks durchprogrammieren. Du gibst die Reihenfolge der Felder in der Select-Anweisung vor und so kannst du auch die Feldnamen des Records entsprechend zuordnen. Das Ganze mit einem entsprechenden Kommentar versehen ist es auch nach zwei Jahren noch zu verstehen.

Bei der Lösung mit RTTI bekommst du zwar immer die passende Zuordnung der Felder aus der Select-Anweisung zu den Recordfeldern, allerdings sieht man das später auch nicht gleich und es bläht den Code ziemlich auf. Zuätzlich musst du dafür sorgen, daß die Record-Felder immer exakt so heißen, wie die Felder in der AD-Tabelle, was schon mal zu Problemen führen kann oder einfach nur unschön ist (wer nennt ein Record-Feld denn einfach nur "l" oder "cn"). Bei der einfachen Lösung kannst du im Record auch "CommonName" statt "cn" schreiben und "Location" statt einfach nur "l".
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#10

AW: dynamisch Records ansprechen

  Alt 3. Aug 2012, 11:35
Bei der Lösung mit RTTI bekommst du zwar immer die passende Zuordnung der Felder aus der Select-Anweisung zu den Recordfeldern, allerdings sieht man das später auch nicht gleich und es bläht den Code ziemlich auf. Zuätzlich musst du dafür sorgen, daß die Record-Felder immer exakt so heißen, wie die Felder in der AD-Tabelle, was schon mal zu Problemen führen kann oder einfach nur unschön ist (wer nennt ein Record-Feld denn einfach nur "l" oder "cn"). Bei der einfachen Lösung kannst du im Record auch "CommonName" statt "cn" schreiben und "Location" statt einfach nur "l".
Das geht mit der RTTI auch, man muss sich nur zu helfen wissen. Du kannst für jedes Feld ein Attribut führen, um das Mapping zu gewährleisten. Oder du definierst dir eine Config-Datei für sowas. Aber gut, das ist dann auch wieder mit Kanonen auf Spatzen geschossen

Ebenso muss dazu gesagt werden, dass potentielle Fehler bei der ausprogrammieren Version auch schon durch den Compiler gefunden werden, also z.B. Schreibfehler, und nicht erst zur Laufzeit.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz