Mit DataSnap geht das supereinfach.
Professional ... da ist das nicht mit dabei
Aber ja, auf der einen Seite ein DataSet befüllen und um die Übertragung kümmert sich das DataSnap.
Am Ende ist das fast wie ein lokaler Prozeduraufruf, wobei DataSnap den Aufruf zum Server schickt und die Antwort (hier das DataSet) zurück holt.
z.B.
function TMyDataSnapModul.HoleMeldungen(Anlagentyp: string; MeldungenSeit: TDataTime; Aufsteigend: Boolean=True): TDataSet;