Benutzerdefinierter Befehl mit Datenübergabe

Was ist ACT! ? - Wer braucht ACT! ? - Was kann ACT! ?

Moderatoren: Ingrid Weigoldt, Schlesselmann

Antworten
klumaiero
Beiträge: 3
Registriert: Donnerstag 18. September 2008, 08:56

Benutzerdefinierter Befehl mit Datenübergabe

Beitrag von klumaiero »

Guten Tag,

ich habe leider von ACT keine wirkliche Ahnung, hoffe daher hier Spezialisten zu finden die mir helfen können.

Was ich erreichen möchte ist mittels eines Buttons in der Symbolleiste ein Programm zu starten und an dieses Parameter (Wert aus einem Feld des aktuell geöffneten Kontaktes) zu übergeben.

Ich zeige das mal am Beispiel Explorer:
statisch ist das kein Problem:
explorer.exe X:

Ich möchte gerne die Argumente dynamisch übergeben:
explorer.exe %Kunde%

Wie gesagt, es geht natürlich nicht um den Explorer, aber ich glaube sie verstehen so worum es mir geht.

Vielen Dank im Voraus
Ingrid Weigoldt
Beiträge: 3027
Registriert: Donnerstag 24. April 2003, 02:00
Wohnort: Viernheim

Beitrag von Ingrid Weigoldt »

Hallo klumaiero,

interessieren Sie sich doch mal für die Möglichkeiten von FORMELACT, einem kostenlosen AddOn von Melville-Schellmann (Download, FreeOns).
Schöne Grüße aus Viernheim
Ingrid Weigoldt
klumaiero
Beiträge: 3
Registriert: Donnerstag 18. September 2008, 08:56

Beitrag von klumaiero »

Hallo Fr. Weigoldt,

hat mich schon ein ganzen Stück weitergebracht.
Ich wusste nicht das es für ACT einen SDK gibt und habe darüber leider auch keine Doku.

Habe das Script FormelACT jetzt so weit ausgeschlachtet das es meine Anforderungen entsprechen würde, nur eins ist mir nicht klar.

In der Function SetCurrentLookup() wird ja eine temporäre Datei erstellt die die aktuelle Abfrage enthält.

Bei mir sieht das so aus:

Act 3.0 Contact Lookup ArchiveKc:\documents and settings\administrator\my documents\act\daten\kontakte.dbf

Als Ergebnis bekomme ich innerhalb der Funktion mittels

Code: Alles auswählen

ACTTable.Data(1)
immer die Unique_ID des ersten Datensatzen zurück (Ist ja auch klar, schiesslich wird ja mit

Code: Alles auswählen

ACTTable.MoveFirst
auf den ersten Datensatz gesprungen).

Nur wie komme ich auf den aktuellen Datensatz, sprich auf den Werte des eines Feldes im aktuellen Datensatz ?

Vieleicht gibts sowas wie

Code: Alles auswählen

ACTTable.MoveCurrent
?
Robert Schellmann
Beiträge: 1675
Registriert: Samstag 14. April 2001, 02:00
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Robert Schellmann »

Hallo klumaiero,

reicht die hier beschriebene Funktion von FormalACT nicht aus?

Neue Version 1.7 von FormelACT mit Run-Befehl
und
FormelACT 1.9 - Neue Version

Die ID (Nummern) der Felder bekommen Sie mit FeldInfo2 heraus.

FormalACT verarbeitet ohne das "?" immer den aktuellen Kontakt in der laufenden ACT!-Anwendung.

Gruß
Robert Schellmann
Bild MSControl4 - wird Ihre ACT!-Daten zum Rotieren bringen...
klumaiero
Beiträge: 3
Registriert: Donnerstag 18. September 2008, 08:56

nein das reicht mir leider nicht

Beitrag von klumaiero »

..wie gesagt, ich habe das Script von Hrn. Schellmann völlig zweckentfremden und ausgeschlachtet.

Ausserdem habe ich eine Funktion Search hinzugefügt.
Diese Funktion lädt ein vordefinierte XML File, ersetzt den Suchbegriff durch die Unique_ID des aktuellen Datensatzes, schreibt das geänderte File in einen Ordner und startet die mit der Dateiendung verknüpfte Applikation.

Es tut mir leid, ich bin zu blöd um zu verstehen was das
FormalACT verarbeitet ohne das "?" immer den aktuellen Kontakt in der laufenden ACT!-Anwendung.
bedeutet.

Leider wir mit der MsgBox immerdie Unique_Id des ersten Datensatzes ausgegeben und ich weis nicht was ich machen muss um die des aktuellen zu bekommen.

Code: Alles auswählen

Option Explicit

Public Const cAnwendung = "ActSuche"

Public Const AVContact = 1
Public Const AVGroup = 3

Public FSO
Public ACTAPP
Public ACTView
Public ACTDatabase
Public ACTTable
Public ScriptFolderName
Public Modus
Public CurrentIDs
Public CurrentRecordNumber

Public WSH
'starte Sub Main
Main

' --------------------------------------------------------------------------
Function InitACTOLE()

InitACTOLE = False

On Error Resume Next
	Set ACTAPP = CreateObject("ACTOLE.APPOBJECT")
	If Err.Number <> 0 Then
		MsgBox "Es konnte keine OLE-Verbindung zur ACT!-Anwendung erstellt werden." + vbCrLf + _
		       "Fehlernummer: " + CStr(Err.Number) + vbCrLf + _
		       "Fehlerbeschreibung: " + Err.Description, vbExlcamation , cAnwendung
		On Error GoTo 0
		Exit Function
	End If
On Error GoTo 0

'MsgBox(ACTAPP.GetOpenDBName)	'aktuelle Datenbank

If Not ACTAPP Is Nothing Then
	If ACTAPP.GetOpenDBName() <> "" then
		Set ACTView = ACTAPP.Views.GetActive
		'MsgBox(ACTView.Type )	'1 = Kontakte, 3= Gruppen
		If Not ACTView Is Nothing Then
			If ACTView.Type = AVContact OR ACTView.Type = AVGroup Then
				InitACTOLE = True
			End If
		End If
	End If
End If

End Function
'  --------------------------------------------------------------------------
Function InitACTDataBase()
InitACTDataBase = False

'On Error Resume Next
'WScript.Echo "Verbindung zur ACT!-Datenbank wird aufgebaut..."
Set ACTDatabase = CreateObject("ACTOLE.Database")
Select Case Err.Number
	Case 429, 501
		MsgBox "Error "+ CStr(Err.Number)+ " ACTOLE" + vbCrLf + _
		               cAnwendung + " kann keine OLE-Verbindung zur ACT!-Datenbank erstellen." + vbCrLf + _
		               "Fehlernummer: " + CStr(Err.Number) + vbCrLf + _
		               "Fehlerbeschreibung: " + Err.Description , vbExlcamation , cAnwendung
		Exit Function
	Case 0
		ACTDatabase.OpenEx ""
		'WScript.Echo "Verbindung zur ACT!-Datenbank wurde aufgebaut."
	Case Else
		MsgBox "Error " + CStr(Err.Number) + " ACTOLE" + vbCrLf + _
                  	cAnwendung + " kann keine OLE-Verbindung zur ACT!-Datenbank erstellen." + vbCrLf + _
			"Fehlernummer: " + CStr(Err.Number) + vbCrLf + _
			"Fehlerbeschreibung: " + Err.Description , vbExlcamation , cAnwendung	
		Exit Function
End Select
'On Error Goto 0

InitACTDataBase = True

End Function
'---------------------------------------------------------------
Function SetCurrentLookup()
'WScript.Echo "..Funktion SetCurrentLookup"
Dim sTempFile

SetCurrentLookup = False

If ACTAPP Is Nothing Then Exit Function
'WScript.Echo "ACTAPP vorhanden"
If ACTDatabase Is Nothing Then Exit Function
'WScript.Echo "ACTDatabase vorhanden"
If FSO is Nothing Then Exit Function
'WScript.Echo "FSO vorhanden"


'WScript.Echo "Die aktuelle ACT!-Suche wird ermittelt..."

Select Case ACTView.Type
	Case AVContact
		Set ACTTable = ACTDatabase.Contact
		' Save Current COntact-Lookup
		'WScript.Echo "speichere TemporäreSuche (" + sTempFile + ")"
		sTempFile = FSO.GetSpecialFolder(2) + "\ActLookup\" + FSO.GetTempName
		ACTAPP.SaveCurrentLookup sTempFile
				
		Select Case ACTAPP.GetLastError
			Case 0   'S_OK 
			Case Else
				MsgBox "Es ist ein OLE-Fehler beim Speichern der aktuellen ACT!-Suche aufgetreten." + vbCrLf + _
				       "OLE-Fehlernummer: " + CStr(ACTAPP.GetLastError) + vbCrLf + _
				       "Temporäre Lookup-Datei:" + sTempFile , vbExclamation , cAnwendung
				Exit Function
		End Select
		If FSO.FileExists(sTempFile) = False Then
			MsgBox "Die temporäre Lookup-Datei '" + sTempFile + "' konnte nicht gefunden werden.", vbExclamation , cAnwendung
			Exit Function
		End If
		' Load Current Contact Lookup
		ACTTable.LoadLookUpQuery sTempFile
		Select Case ACTTable.LastError
			Case 0   'S_OK 
			Case Else
				MsgBox "Es ist ein OLE-Fehler beim Laden der aktuellen ACT!-Suche aufgetreten." + vbCrLf + _
				       "OLE-Fehlernummer: " + CStr(ACTTable.LastError) + vbCrLf + _
				       "Datei:" + sTempFile , vbExclamation , cAnwendung
				Exit Function
		End Select
		'FSO.DeleteFile sTempFile

	Case AVGroup
		Set ACTTable = ACTDatabase.Group
End Select
'WScript.Echo "Die aktuelle ACT!-Suche wurde ermittelt (" +  +")"
'ACTTable.MoveLast		' gehe zu letztem Datensatz
'ACTTable.MoveFirst		' gehe zu erstem Datensatz
'ACTTable.RecordCount	' Anzahl der Datensätze
SetCurrentLookup = True

End Function
' --------------------------------------------------------------------------
Function Search(typ, expression)
MsgBox(expression)
End Function

Sub Main()


Set ACTAPP = Nothing
Set ACTView = Nothing
Set ACTDatabase = Nothing
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WSH = CreateObject("WScript.Shell")

Dim sFieldValue 
Dim sFieldValueLengh
Dim dokTyp

	If InitACTOLE = True Then 'Check ob die verbindung zu Act hergestellt wurde
		'WScript.Echo "Verbindung zu Act hergestellt"
		InitACTDataBase()
		SetCurrentLookup()
		sFieldValue = CStr(ACTTable.Data(CLng(1)))
		If sFieldValue <> "" Then
			dokTyp = WScript.Arguments.Item(0)
			Select Case(dokTyp)
			Case "Aktenvermerk" Search "Aktenvermerk", sFieldValue
			
' 			Case "Allg. Dokument"
' 			Case "Angebot"
' 			Case "Baustelle"
' 			Case "Lieferschein"
' 			Case "Preis"
' 			Case "Rechnung"
' 			Case "Technik
			'Case "Vertrag" windreamSearch "Vertrag", sFieldValue
				
			Case Else 
				MsgBox("kein oder kein gültiger Dokumententyp übergeben")
			End Select
		Else
			MsgBox("Keine zeichen an die Suche übergeben")
		End If
	Else 'keine Verbindung zu ACT
		MsgBox("Es konnte keine Verbindung zur ACT!-Anwendung hergestellt werden.")
	End If
	Set ACTView = Nothing
	Set ACTAPP = Nothing
	Set ACTTable = Nothing
	Set ACTDatabase = Nothing
End Sub
Robert Schellmann
Beiträge: 1675
Registriert: Samstag 14. April 2001, 02:00
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Robert Schellmann »

Hallo klumaiero,

eigentlich mache ich im ACTForum keinen Support für meinen eigenen Quellcode oder die ACT!-SDKs. Da es sich hier um ein Anwender- und nicht um ein Entwickler-Forum handelt.

Nur ein Tipp:

Über das ACTView-Objekt (s. Function InitACTOLE)
kann man folgende Methoden verwenden:

- ActView.GetCurrentID : Erhält man die UniqueID des aktuellen ACT! Kontaktes
- ActView.GetField(FieldID) : Erhält man den Inhalt eine ACT!-Feldes des aktuellen ACT! Kontaktes
- ActView.SetField FieldID, Value : Kann ein Feldinhalt ändern

Gruß
Robert Schellmann
Bild MSControl4 - wird Ihre ACT!-Daten zum Rotieren bringen...
Antworten