Direkte SQL Abfrage

Ich versuche aus einem Scipt einen Maximalwert einer Spalte einer Zeile zu ermitteln. Hierfür
müsste ich einen SQL Befehl in der Art absetzen:

Select MAX(TrackingID) from TrMailTracking

Ich habe das im Script wie folgt probiert und komme nicht weiter:

ViewConfig oTrMailView = cRM.CurrentProject.ViewConfigs.ItemByName("TrMailTracking");
RecordSet oRecordSet = oTrMailView.CreateRecordSet();

bool bSuccess = oRecordSet.SetFilterDirectSQL("SELECT Max(TrackingID) from TrMailTracking", false);

Da nach Doku die ID im Filter vorhanden sein soll, habe ich auch dies ohne Erfolgt versucht:

bool bSuccess = oRecordSet.SetFilterDirectSQL("SELECT Top(1) * from TrMailTracking order by TrackingID desc", false);

Wahrscheinlich der falsche Weg. Wie kann ich einen SQL Befehl gegen die verwendete Datenbank absetzen ?

Unter der Annahme, dass die auf der Tabelle „TrMailTracking“ basierende Ansicht eine Datensatz-ID Spalte namens „ID“ besitzt, können Sie folgende Abfrage verwenden:

bool bSuccess = oRecordSet.SetFilterDirectSQL("select \"TrMailTracking\".\"ID\" top 1 from \"TrMailTracking\" order by \"TrMailTracking\".\"TrackingID\" desc", false);

Aus Performancegründen empfehle ich Ihnen einen Index auf die Spalte „TrackingID“ zu legen. Sollten Sie im cRM bereits eine Sortierung für diese Feld eingerichtet haben, ist dies bereits automatisch der Fall. (Bei Microsoft SQL Server als Datenbanksystem.)

Der Filter hat anschließend 1 Treffer und Sie können die Werte dann nach einem nach SetFilterDirectSQL ausgeführten oRecordSet.MoveFirst über oRecordSet.CurrentRecord.GetContentsValueByName("TrMailTracking") abrufen.

Eine beliebige, komplett freie SQL Abfrage zur Ermittlung von jedwedem (z.B. berechneten) Datenwert ohne eine zugrundeliegende Ansicht ist über die SDK Schnittstelle so nicht vorgesehen - Sie brauchen immer eine Ansicht für die Sie ein RecordSet erstellen und über dessen Record dann Felder auslesen. Was in Ihrem Szenario aber der Fall zu sein scheint. :slight_smile:

Danke, das war mal schnell.

Der Filter muss in diesem Fall allerdings so lauten ( sonst funktioniert es nicht)

Code:

        ViewConfig oTrMailView = cRM.CurrentProject.ViewConfigs.ItemByName("TrMailTracking");
        RecordSet oRecordSet = oTrMailView.CreateRecordSet();
        Record oRecord = null;

        bool bSuccess = oRecordSet.SetFilterDirectSQL("select Top(1) \"TrMailTracking\".\"ID\"  from \"TrMailTracking\" order by \"TrMailTracking\".\"TrackingID\" desc ", false);
        if (oRecordSet.MoveFirst())
        {
            oRecord = oRecordSet.CurrentRecord;
            string  iTrId = oRecord.GetContentsByName("TrackingID");
        }