CRM Ninox

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.

 

 

Haben Sie noch eine Aufgabe?

Bitte füllen Sie die Felder vollständig aus, damit wir Ihre Anfrage optimal und schnellstmöglich bearbeiten können.


    captcha


    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.