Bsp: Spaltennamen (mit Hilfe Ninox-Editor einstellbar)
Feldname, Tabellename.Feldname 'Feld Name', Tabellename.'Feld Name' //Feldname mit Leerzeichen
In der Spalte ‚Name‘ formatiere Ausgabe ‚Vorname + Nachname‘ definieren.
Name //Formel-Element. Funktion 'Name' in Tabelle Mitarbeiter: Vorname + " " + Nachname Mitarbeiter.Name //Formel-Element in andere Tabelle aufrufen. Funktion 'Name', aus Tabelle Mitarbeiter (Verknüpfung muss vorhanden sein)
"Hallo " + Vorname + "!"
---Hallo {Vorname}!--- //geht auch, also alternative Syntax
Name + " (" + Position + ")" //Vorname Nachname + Position (in Klammen)
Bediente Formatierung . Abhänding von Inhalte Farben oder Icons zuweisen.
Mitarbeiter.Geschlecht = "Frau" // Icon auswählen Mitarbeiter.Geschlecht = "Herr" // Icon auswählen Art = 2 //Also Variante: Pause. Gelbe Hintergrundfarbe setzen.
Definition
let my := this; //aktuelle Zeile als Objekt let kunden := select 'Kunden (neu)' where Status = 2; //Array mit Datensätze/Objekten aus Datenbank let i := 0; //Laufvariable/Zähler let sameGesellschaft := false; // Bool-Variable (ja/nein) let meinText := "Hallo " + Vorname + "!"; meinText //Ausgabe String text(kunden['id'=1] //Object(Kunde) to String concat(kunden) //Objects(viele Kunden) to String durch Komma getrennt
Bsp: Zuweisung nach Bedingungserfüllung.
//Wenn die Startzeit grösser als Endzeit, bzw. falsche Eingabe
if Von > Bis then Von := null end
//Zahlungsart bestimmen
//Felder Betrag(Eingabe) und Zahlungsart(berechnete Ausgabe)
if Betrag = null then
"Bitte geben Sie einen Betrag ein!"
else if Betrag >= 30 then
"Karte"
else
"Bar"
end
end
//ZP (ZusatzPerson/Familienmitglied)
//einen Objekt vom Array mit 'Zusätzliche Personen'
if my.ZusatzPerson != 0 then
for ZP in my.'Zusätzliche Person' do
if ZP.Gesellschaft = my.Gesellschaft then
sameGesellschaft := true
else
sameGesellschaft := false
end
end
end
Bsp: Werte aus zwei Tabellen vergleichen
//Trigger (nach Änderung)
//Vorname aus Tabelle 'Mitarbeiter' (bekannt durch die Verlinkung von Tabelle 'Mitarbeiter')
if Mitarbeiter.Vorname = "Clara" and Von = time(12, 0) then
Testspalte := "stimmt. 12:00";
else
Testspalte := "stimmt nicht."
end
Bsp: Formel-Feld (SWITCH/CASE-Abfrage) eine Meldung nach gewählte Zahlungsart (Auswahl-Feld).
switch Zahlungsart do
case 1:
"Zahlungsart: " + text(Zahlungsart) + "."
case 2:
"Zahlungsart: " + text(Zahlungsart) + ". Erst ab 30 Euro."
case 3:
"Zahlungsart: " + text(Zahlungsart) + ". Unterschrift nicht vergessen!"
default:
"Bitte wählen Sie eine Zahlungsart aus!"
end
Bsp: Operator ‚like‘ (enthält)
"Hello" like "el" //true "el" like "Hello" //false
Mit select kаnn man innerhalb einer Datenbank über ein Skript auf jeden Datensatz einer beliebigen Tabelle zugreifen.
//Mit (select Kunden).Kundennummer greifen Sie zum Beispiel auf alle Kundennummern der Tabelle Kunden zu. let myArray := (select Kunden).Kundennummer;
Bsp: Datensätze in DB selektieren. Allen Kunden, die den Status 2 haben.
let kunden := select 'Kunden (neu)' where Status = 2; //anderen Einsatz let kunden := select 'Kunden (neu)'; kunden['id'=2] //weitere Filter für bessere Perfomance
BSP: Benutzer nach eingegebene E-Mail aussuchen. (Feld: MeineEingabe)
let myUser := (select Benutzer where 'E-Mail' = MeineEingabe);
let myError := "User not found";
if myUser != null then
text(myUser.Benutzer) //to String, no Object <- Alle Varianten sollen gleiche type von Ausgabe haben
else
myError //String
end
Datensätze sortieren
(select Rechnungen) order by Summe //nach dem Feld Summe sortiert (von klein nach groß)
//Sortieren mit Funktion. Rechnungnummer in Format: RE-12574 (nach erste Ziffer in Rechnung, also Zeichen 4 (Position 3))
(select Rechnungen where Datum = today()) order by number(substr('Rechnungs-Nr.', 3))
//Sortieren mit upper(), lower(), sort(), weil große Buchstaben habe grossere Index für Sortieung
concat(((select 'Beispiel für order by') order by upper(Vorname)).Vorname) //mit upper()
concat(sort((select 'Beispiel für order by').Vorname)) //mit sort(), concat() -zeigt mehrere Sätze als String, mit Komma getrennt
Datensätze erstellen und löschen
create Kunden //leerer Datensatz in der Tabelle Kunden //Datensatz in der Tabelle Kunden mit Daten let neuerKunde := (create Kunden); neuerKunde.(Kundennummer := "K" + number(now())) delete this //Der aktuelle Datensatz wird gelöscht. delete select Kunden where Status = 4 //mehrere Datensätze löschen
for … in … do … end (Schleife)
Mit einer Schleife können Sie einen Code-Block automatisch mehrmals hintereinander ausführen
Die Anweisungen eines Code-Blocks werden auf jedes Element eines Arrays angewendet.
Bsp: Allen Kunden, die den Status 2 haben, einen neuen, den Status 1 geben.
let kunden := select 'Kunden (neu)' where Status = 2; for kunde in kunden do kunde.Status := 1; end
Bsp: Weitere Personen in Familienversicherung
let my := this;
let sameGesellschaft := false;
let MainGeSet := false;
//ZP (ZusatzPerson/Familienmitglied)
//einen Objekt vom Array mit 'Zusätzliche Personen'
if my.ZusatzPerson != 0 then
if Tarif != null then
for ZP in my.'Zusätzliche Person' do
if ZP.Gesellschaft = my.Gesellschaft then
sameGesellschaft := true
else
sameGesellschaft := false
end
end
else
for ZP in my.'Zusätzliche Person' do
if MainGeSet = false then
my.(Gesellschaft := ZP.Gesellschaft);
MainGeSet := true;
sameGesellschaft := true
else
if ZP.Gesellschaft = my.Gesellschaft then
sameGesellschaft := true
else
sameGesellschaft := false
end
end
end
end
else
sameGesellschaft := true
end;
Schleife mit Laufvariable
for i from 0 to 5 do ... end;
for i from 0 to 10 step 2 do ... end;
Berechnung der Stunden
//Formel-Element für die Berechnung der Stunden //Definition Variable, Stunden berechnen (von - bis, in Stunden umwandeln) let myF := round((number(Bis) - number(Von)) / 1000 / 60 / 60, 2); //Abfrage. Stunden mit '-' anzeigen, wenn 'Art' = 2 (also Pause. Art = 1 -> Arbeit) if Art = 2 then -myF else myF end
Die Prüfung für das Anlegen der neuen Datensatz:
Bearbeiter_old := user();
Besitzer := text(user());
"'Datum + Uhrzeit' := now()";
if text(Linked) = "Ja" then
Status := "Versicherte Person"
else
Status := "Zugeteilt"
end
1. Select Abfrage
let filter1 := (select Angebote)[number(lead.VB) < number(VB)] let myLeads := (select Leads)[date(Versicherungsbegin) > today() - 15]
2. Array definieren und it nummerische Werte auffühlen:
"/ IDs von gefundene Angebote /";
let angebotenIds := [0];
for item in filter1 do
angebotenIds := array(angebotenIds, [number(item.Nr)])
end;
let leadsIds := [0];
for item in myLeads do
leadsIds := array(leadsIds, [number(item.Nr)])
end;
3. Zwei Arrays zusamenfassen. (Doppelte Werde entfehrnen)
let myIDs := unique(array(angebotenIds, leadsIds));
4. Die Werte aus Array elemenieren. (die in zweite Array vorhanden sind)
let minusAngebote := leadsIds[var v := this; not angebotenIds[= v]];
"/ Sortierung 2. Angebote ohne Ids, die mit LeadsIDS übereinstimmen /";
let myAngebote := angebotenIds[var v := this;
not leadsIds[= v]];
"/ Ausgabe Ids, kommagetrennt /";
alert(concat(activeAngebote));
5. Array in Funktion
function maBruttoMB(myMitarbeiter : text,myVon : date,myBis : date) do
"/ hier select abschlussLeads ............ /";
let myBruttoMB := sum(abschlussLeads[text(Gesellschaft) != "ERGO ZEZ"].MB_Gesamt);
let myBruttoERGO := sum(abschlussLeads[text(Gesellschaft) = "ERGO ZEZ"].MB_Gesamt);
let myMBs := [number(myBruttoMB), number(myBruttoERGO)];
myMBs
end;
"/ Aufruf /";
let mbArray := maBruttoMB(text(my.'Mitarbeiter 1'), myVon, myBis);
ma1bruttoMBohneEZ := item(mbArray, 0);
ma1bruttoMB_EZ := item(mbArray, 1)
Ninox unterscheidet zwei Arten von Funktionen: Funktion & Prozedur
Eine Funktion liefert auf Basis der Werte der Parameter ein bestimmtes Ergebnis.
Eine Prozedur führt eine Reihe von aufeinander folgenden Einzelaktionen aus.
Einfache Funktionen
function hello(name : text) do
"Hello " + name + "! Good to see you."
end;
alert(hello("John"));
Funktion mit Tabelle als Parameter
function machIrgendwasMitMeinemKunden(meinKunde : 'Kunde') do meinKunde.Nummer := "TODO" end
Funktion um die Datensätze in DB bearbeiten
function getEigeneSteuernummer() do let mySetup := first(select 'Setup'); mySetup.Steuernummer; end
—————————————-
Wenn Sie Ihre Funktion in der Tab-Leiste der Datenbank unter Optionen in Globale Funktionen eingeben, können Sie Ihre Funktionen in der gesamten Datenbank verwenden.
Bsp: Trigger nach Öffnen (Unter ‚Optionen‘ hinzufügen für den gesamte Datenbank)
let xBenutzer := (select Benutzer where Tageslimit_Erreicht = true);
if xBenutzer != null then
let xHeute := today();
for Benutzer in xBenutzer do
if Benutzer.Aktivierung != xHeute then
Benutzer.('Tageszähler' := 0);
Benutzer.(Aktivierung := xHeute)
end
end
end
Bsp: Aktuelle Datum automatisch zuweisen
'versendet am' := today(); //Mit Formatirung format(today(), "DD.MM.YYYY")
Bsp: Die Zeit für die Bedienung prüfen
if Mitarbeiter.Vorname = "Clara" and Von = time(12, 0) then
"stimmt. 12:00";
else
"stimmt nicht."
end
Berechnung der Stunden
//Formel-Element für die Berechnung der Stunden //Definition Variable, Stunden berechnen (von - bis, in Stunden umwandeln) let myF := round((number(Bis) - number(Von)) / 1000 / 60 / 60, 2); //Abfrage. Stunden mit '-' anzeigen, wenn 'Art' = 2 (also Pause. Art = 1 -> Arbeit) if Art = 2 then -myF else myF end
//Berechnung Stunden sum(Zeiterfassung[Mitarbeiter = mitarbeiter()].Stunden) sum(Zeiterfassung[Mitarbeiter = mitarbeiter() and Art = 1].Stunden)
Bsp: Kalendertag bestimmen (Trigger nach Änderung)
if Datum then
let me := this;
let exist := first(select Kalendertage where Datum = me.Datum);
if exist then
me.(Kalendertage := exist)
else
let newKalendertag := (create Kalendertage);
newKalendertag.(Datum := me.Datum);
me.(Kalendertage := newKalendertag)
end
else
Kalendertage := 0
end
Bsp: Stundenzettel (An-/Abmelden)
//Button EINSTEMPELN Termin := appointment(now(), now()) //Button AUSSTEMPELN Termin := appointment(start(Termin), now())
Funktion: Anlegen aller Tage eines Monats (August)
let myYear := 2022; let myMonth := 8; let myDate := date(myYear, myMonth, 1) let lastDate := date(myYear, myMonth + 1, 0) while myDate <= lastDate do let newDate := create Arbeitszeittabelle; newDate.(Datum := myDate); myDate := date(year(myDate), month(myDate), day(myDate) + 1); end
Feld anzeigen, wenn: (oder Feld schreibar, wenn)
isAdminMode() //Registerkarte (Layout Felder) fuer Administrator anzeigen
userHasRole("admin") or userHasRole("Boss") //definierte Role
Status = 3 // variable status -> genehmigt bzw. 3
Lesbar wenn:
Mitarbeiter = mitarbeiter() or Mitarbeiter.Team = mitarbeiter().Team and mitarbeiter().Teamleitung or isAdminMode()
1. Zuerst die Datensatze nach Vorgabe selektieren. (Felder mit optionale Daten)
2. Daten -> Massenbearbeitung – > gewünschte Spalten der Tabelle. -> Auswahl nach Anforderung
Ein Beispiel für berechnete Wert:
//Massenbearbeitung
if Mitarbeiter.Vorname = "Clara" and Von = time(12, 0) then
"stimmt. 12:00";
else
"stimmt nicht."
end
//Mögliche Fehler: Diese Funktion darf keine Datenänderungen vornehmen.
//Lösung: Keine Variable im Feld zuweisen. Also die Variante myfield : = "stimmt. 12:00"; ist falsch
Neuer Trigger nach Öffnen. (des Programm)
Aufgabe: 1. Aktuelle Datum für alle Benutzer setzen 2. Höchste ‚Anzahl Leads‘ für Benutzer ausgleichen. 3. Abgearbeitete ‚Leads‘ auf 0 setzen.
let alleBenutzer := (select Benutzer);
let anzahlLeadsMax := first(rsort((select Benutzer).'Anzahl Leads'));
let xHeute := today();
for aktBenutzer in alleBenutzer do
if aktBenutzer.Aktivierung != xHeute then
aktBenutzer.(Aktivierung := xHeute);
aktBenutzer.('Anzahl Leads' := anzahlLeadsMax);
aktBenutzer.('Tageszähler' := 0)
end
end
Problem:
Das NX-Skript startet nicht in der Nacht. Das Programm startet nicht, obwohl durch Anfragen (Formulare aus Webseiten) neue Datensätze in der Datenbank angelegt werden.
Lösung:
– Zugriffrechte für alle Felder angepast (nicht nur Admin schreiben darf)
– das Feld ‚Tageslimit_Aktiv‘, folgende Trigger nach Änderungen enfernt, weil globale Trigger dasselbe macht.
if Tageslimit_Aktiv = true then
Aktivierung := today() //Feld 'Aktivierung' mit dem Datum, von globale Trigger gesetzt wird
end
Alter Trigger nach Öffnen. (des Programm)
let xBenutzer := (select Benutzer where Tageslimit_Erreicht = true);
if xBenutzer != null then
let xHeute := today();
for Benutzer in xBenutzer do
if Benutzer.Aktivierung != xHeute then
Benutzer.('Tageszähler' := 0);
Benutzer.(Aktivierung := xHeute)
end
end
end
BSP: Globale Funktion
function hallo(name : text,alter : number) do
"Hallo " + name + ". Du bist " + alter + " Jahre alt!"
end
hallo("Andrej", 43)//Aufruf der Funktione überall möglich
Mail erstellen
sendEmail({
from: "a.erlich@zahnschutz-vergleich.de",
to: "it.aeleads@gmail.com",
subject: "Antrag für " + firstname + " " + lastname + " ",
text: " ",
html: "Vorname: " + firstname + "<br>" + "Nachname: " + lastname + "<br>" + "Geburtstag: " + geburtstag + "<br>" + "Straße: " + strasse + "<br>" + "Hausnummer: " + hausnummer + "<br>" + "plz: " + plz + "<br>" + "ort: " + ort + "<br>" + "email: " + email + "<br>" + "Email 2: " + 'Email 2' + "<br>" + "telefon: " + telefon + "<br>" + "Telefon 2: " + 'Telefon 2' + "<br>" + "Krankenkasse: " + Krankenkasse + "<br>" + "Berufsbezeichnung: " + Berufsbezeichnung + "<br>" + "IBAN: " + IBAN + "<br>" + "Notiz: " + 'Notizen / Kundenangaben' + "<br><br>" + "Zusätzliche Personen: " + 'Abweichende versicherte Person (VP) ?' + "<br>" + "(linked Person) Vorname: " + 'Zusätzliche Person'.firstname + "<br>" + "(linked Person) Nachname: " + 'Zusätzliche Person'.lastname + "<br>" + "(linked Person) Krankenkasse: " + 'Zusätzliche Person'.Krankenkasse + "<br><br>" + "laufende Behandlung: " + 'laufende Behandlung' + "<br>" + "Notiz(angeratene Behandlung): " + 'Notiz(angeratene Behandlung)' + "<br>" + "angeratene Behandlung: " + 'angeratene Behandlung' + "<br>" + "Notiz(angeratene Behandlung): " + 'Notiz(angeratene Behandlung)' + "<br>" + "Heil- und Kostenplan: " + 'Heil- und Kostenplan' + "<br>" + "Notiz(Heil- und Kostenplan): " + 'Notiz(Heil- und Kostenplan)' + "<br>" + "Älter als 6 Monate: " + 'Älter als 6 Monate' + "<br>" + "fehlende Zähne: " + 'fehlende Zähne' + "<br>" + "Anzahl (fehlende Zähne): " + 'Anzahl (fehlende Zähne)' + "<br>" + "Paradontose aktuell: " + 'Paradontose aktuell' + "<br>" + "Paradontose letzen 3 Jahre: " + 'Paradontose letzen 3 Jahre' + "<br>" + "Fester Zahnersatz: " + 'Fester Zahnersatz' + "<br>" + "Anzahl (fester Zahnersatz): " + 'Anzahl (fester Zahnersatz)' + "<br>" + "älter als 10Jahre (fester Zahnersatz): " + 'älter als 10Jahre (fester Zahnersatz)' + "<br>" + "Prothesen: " + Prothesen_alt + "<br>" + "Anzahl (Prothesen): " + 'Anzahl (Prothesen)' + "<br>" + "älter als 10Jahre (Prothesen): " + 'älter als 10Jahre (Prothesen)' + "<br>" + "PZR: " + PZR + "<br>" + "Notizen: " + Notizen + "<br><br>" + "Versicherungsbeginn: " + Versicherungsbeginn + "<br>" + "Monatsbeitrag: " + 'MB Gesamt' + "<br>" + "Tarif: " + Tarif_neu.Angebote.Gesellschaft + " " + Tarif_neu.Angebote.Name + "<br>" + "Sonstiges: " + Sonstiges + "<br>" + "Nachname: " + lastname + "<br>" + "Grüße, Ihr Zahnschutz Team",
attachments: files(this)
});
Weitere Information. (Inhalt fürs Feld mit Notiz zuweisen)
Notizen := "Vorname: " + firstname + "
Nachname: " + lastname + "
Geburtstag: " + geburtstag + "
Straße: " + strasse + "
Hausnummer: " + hausnummer + "
plz: " + plz + "
ort: " + ort + "
email: " + email + "
telefon: " + telefon + "
Krankenkasse: " + Krankenkasse + "
Berufsbezeichnung: " + Berufsbezeichnung + "
IBAN: " + IBAN
1. Laden Sie das Plugin FB Conversion API (Ordner: gdesign-fb-capi-2) auf Ihre Website herunter. Die Konfigurationsdatei in Root-Verzeichnis offnen (gdesign-fb-capi.php).
2. Neu Pixel bei Facebook erstellen. Dann mit dem Button Meta-Pixel einrichten, eine FB-Javascript generieren. (Schritt 1)
3. Neue Pixel-ID aus FB-Javascript in WP-Plugin an drei Stellen anpassen. (Datei: gdesign-fb-capi.php).
4. Bei der Pixel-Einrichtung (Schritt 2) automatische Abgleich aktivieren, und die gesendete Daten wählen. (Vor- Nachname, Land (immer Deutschland), E-mail, Telefon, Externe ID)
5. Unter Facebook-Pixel, unter Tab Eistellungen den Sicherheitschlüssel generieren. Ersetzen Sie diesen Schlüssel im Plugin (gdesign-fb-capi.php). Adminrechte erforderlich.
6. Event Pageview erfassen. Unter Facebook-Pixel, unter Tab Event testen die Testcode kopieren, und im Plugin (gdesign-fb-capi.php) ersetzen. Danach den Link zur Webseite hinzufügen.
7. Die Browser-Werkzeuge (FF Facebook Pixel Helper) sollen die FB-Events erfassen und anzeigen.
8. Serverseitige Event FormLastStep wird auf dem Server mit PHP erstellt (die Funktion liegt in gdesign-fb-capi.php). Den Aufruf erfolgt durch AJAX-Funktion im Multistep-Formular, den Schritt mit dem Spinner.
add_action('wp_ajax_nopriv_wph_ajax_call', 'wph_ajax_call');
add_action('wp_ajax_wph_ajax_call', 'wph_ajax_call');
function wph_ajax_call() {
facebookCapi("FormLastStep");
}
jQuery.ajax({
type: 'post',
url: 'https://www.domain.de/wp-admin/admin-ajax.php',
data: {
action: 'wph_ajax_call',
},
success: function (request) { }
});
9. Letzte Event Lead erfolg nach Absenden der Daten mit dem Multistep-Formular. Hier werden auch fbq-Cookies und _eventID gesendet.
document.addEventListener( 'wpcf7mailsent', function( event ) {
fbq('track', 'Lead', {}, {'eventID': ('; '+document.cookie).split(`; _eventID=`).pop().split(';')[0]});
}, false );
10. Klick-ID (fbc) wird aus dem Facebook-Link mit Get-Parameter ($_GET[fbclid]) generiert.
Bitte füllen Sie die Felder vollständig aus, damit wir Ihre Anfrage optimal und schnellstmöglich bearbeiten können.
Wir erheben Ihre Daten zum Zweck der Durchführung Ihrer Kontaktanfrage. Die Datenverarbeitung beruht auf Artikel 6 Abs. 1 f) DSGVO. Unser berechtigtes Interesse ist, Ihre Anfrage zu beantworten. Eine Weitergabe der Daten an Dritte findet nicht statt. Die Daten werden gelöscht, sobald sie für den Zweck ihrer Verarbeitung nicht mehr erforderlich sind. Sie haben das Recht, der Verwendung Ihrer Daten zum Zweck der Kontaktaufnahme jederzeit zu widersprechen.