Archiv des Intrexx Live! Forums

Hier sehen Sie die Foreneinträge aus dem Intrexx Live! Forum. Bis November 2016 war es das Forum für alle Fragen rund um die Software Intrexx von United Planet.
Seit November 2016 gibt es ein neues moderiertes Forum, das Intrexx Community Forum. Nutzen Sie bitte unbedingt dieses für aktuelle Fragen, Antworten und Informationen.

Wichtig: Dieses Forum dient als Archiv. Die Einträge beziehen sich oft auf ältere Versionen von Intrexx und entsprechen nicht mehr den aktuellen technischen Gegebenheiten.
Daher sollten alle Inhalte ausschließlich von Experten genutzt werden. Bei unsachgemäßer Anwendung kann es zu zeitaufwändigen Problemen oder Datenverlust kommen.
Übersicht > Intrexx Compact: Compact Intrexx > Jahresbezogene Nummerierung

Jahresbezogene Nummerierung

http://www.unitedplanet.com/de/werkstatt/jahresbezogene-nummerierung

2 Tage habe ich jetzt zugebracht. Ich bekomme das nicht zum laufen.
Wer kann mir da mal helfen.
Ich möchte wenn ich einen neuen Datensatz anlege folgende Nummer generieren: "2012.10001"
Wobei die ersten Zahlen das Jahr sind und die Nummer nach dem Punkt immer bei Anlage eines neuen Datensatzes schrittweise um 1 erhöht werden sollen.

Wenn es dann noch einen Button gäbe der mir einen Ordner auf der Festplatte erstellt der genau diese Bezeichnung hat wäre das großes Kino.

Gruß André
08.11.2012 08:02 von SignMaster
In dem Wekstattbeitrag wird auf das Einfügen des Datensatzes reagiert und dann die nächste Nummer berechnet. Ich nehme an, dass das Feld vom Typ String ist. Dann reicht es wahrscheinlich, den größten Feldwert per SQL aus der Datenbank zu lesen (MAX (spaltenname)) und diesen Wert dann zu erhöhen (bzw. beim Jahreswechsel wieder bei 1 anzufangen). Dazu einfach den String am Punkt in zwei Teile splitten und dann Jahr und Nummer als Zahl parsen.

Das Verzeichnis lässt sich mit Groovy leicht anlegen: new File("pfad").mkdirs()
08.11.2012 23:57 von tyrone
In dem Wekstattbeitrag wird auf das Einfügen des Datensatzes reagiert und dann die nächste Nummer berechnet. Ich nehme an, dass das Feld vom Typ String ist. Dann reicht es wahrscheinlich, den größten Feldwert per SQL aus der Datenbank zu lesen (MAX (spaltenname)) und diesen Wert dann zu erhöhen (bzw. beim Jahreswechsel wieder bei 1 anzufangen). Dazu einfach den String am Punkt in zwei Teile splitten und dann Jahr und Nummer als Zahl parsen.

Das Verzeichnis lässt sich mit Groovy leicht anlegen: new File("pfad").mkdirs()

Danke Tyron, für den Beitrag.
Nun ist es aber so das ich davon überhaupt keine Ahnung habe und mir die Anwendung so Step by Step zusammenbastle.
Der Werkstattbeitrag hat mich ausser Zeit zu investieren, nicht weitergebracht.

Gibt es den hier im Forum jemanden der sich dieser Sache annehmen würde?
Als Auftrag sozusagen. Eventuell wird ja da auch mehr draus attention .

Gruß André
09.11.2012 15:46 von SignMaster
Anbei ein kleines Beispiel, das zeigt, was ich meinte.
09.11.2012 21:32 von tyrone
Hallo tyrone,

Vielen Dank für die Arbeit.

Habe das Script auch gleich ausprobiert.
Und wie das so ist, wenn Leute wie ich die keine Ahnung haben, rumfummeln - kommt so etwas heraus. Siehe Anhang.
Ansonsten funktioniert das genau so wie ich es brauche.

Habe ich das richtig verstanden das das Script auch gleich ein Verzeichnis anlegt?
Ich habe das bei mir auf dem Rechner nicht gefunden. ("internal/files")

Ist es auch möglich eine fest definierte Verzeichnisstruktur abzuspeichern? Z.B.:

2012.10001
--- Druckdaten
--- Fraesdaten
--- Images

Im Prinzip sind es immer die gleichen Ordner die ich benötige.

Herzlichen Dank nochmals
Gruß Andre
10.11.2012 09:50 von SignMaster
Habe das Script auch gleich ausprobiert.
Und wie das so ist, wenn Leute wie ich die keine Ahnung haben, rumfummeln - kommt so etwas heraus. Siehe Anhang.
Ansonsten funktioniert das genau so wie ich es brauche.


Man kann natürlich weitere Prüfungen einbauen, etwa um eine verstellte Uhr zu erkennen:

def conn = g_dbConnections.systemConnection

// größte fortlaufende Nummer aus Tabelle holen
def strMaxNumber = g_dbQuery.executeAndGetScalarStringValue(conn, "SELECT MAX(STR_NUMMER) FROM DATAGROUP('89FD12AF4E98F12C3282525D82962E6E8AE4F3DA')")

def strThisYear = now().format("yyyy")

if (strMaxNumber)
{
assert strMaxNumber ==~ /\d{4}\.\d+/ : "bad format ${strMaxNumber}"

def strYear = strMaxNumber.substring(0, 4)
def strNum = strMaxNumber.substring(5)

assert strYear <= strThisYear : "unexpected year ${strYear}"

if (strYear == strThisYear) // Jahreswechsel?
{
// kein Jahreswechsel: laufenden Nummer hochzählen
g_sharedState.strNextNumber = strThisYear + "." + (Integer.parseInt(strNum) + 1)
}
else
{
// Jahreswechsel: laufende Nummer neu beginnen
g_sharedState.strNextNumber = strThisYear + ".10001"
}
}
else
{
// erste laufende Nummer in Tabelle
g_sharedState.strNextNumber = strThisYear + ".10001"
}


Habe ich das richtig verstanden das das Script auch gleich ein Verzeichnis anlegt?
Ich habe das bei mir auf dem Rechner nicht gefunden. ("internal/files")

Ist es auch möglich eine fest definierte Verzeichnisstruktur abzuspeichern? Z.B.:

2012.10001
--- Druckdaten
--- Fraesdaten
--- Images

Im Prinzip sind es immer die gleichen Ordner die ich benötige.


Ja. Die zweite Groovy-Aktion legt ein Verzeichnis unterhalb
internal/files an. Das ist ein Unterverzeichnis des Portalverzeichnisses; wo genau dieses liegt, hängt von Deiner Installation ab. Falls das Verzeichnis dort nicht erstellt werden konnte, tippe ich auf ein Problem mit Berechtigungen auf Betriebssystemebene.

Selbstverständlich kann man beliebige Verzeichnisstrukturen anlegen:

assert g_sharedState.strNextNumber // wurde in der ersten Groovy-Aktion gesetzt

def ´ = new File("internal/files") // oder was auch immer
def dirNumber = new File(dirBase, g_sharedState.strNextNumber)

if (!dirNumber.directory) // Verzeichnis noch nicht vorhanden?
{
assert dirNumber.mkdir() : "cannot create directory ${dirNumber.absolutePath}" // Verzeichnis anlegen

// Unterverzeichnisse anlegen
new File(dirNumber, "Druckdaten").mkdir()
new File(dirNumber, "Fraesdaten").mkdir()
new File(dirNumber, "Images").mkdir()
}


Durch Verändern der Variablen
dirBase lässt sich die Verzeichnisstruktur an einem beliebigen Ort anlegen.

Anbei ein Applikationspaket, das die obigen Änderungen enthält.
10.11.2012 13:33 von tyrone
assert g_sharedState.strNextNumber // wurde in der ersten Groovy-Aktion gesetzt

def dirBase = new File("internal/files") // oder was auch immer
def dirNumber = new File(dirBase, g_sharedState.strNextNumber)

if (!dirNumber.directory) // Verzeichnis noch nicht vorhanden?
{
assert dirNumber.mkdir() : "cannot create directory ${dirNumber.absolutePath}" // Verzeichnis anlegen

// Unterverzeichnisse anlegen
new File(dirNumber, "Druckdaten").mkdir()
new File(dirNumber, "Fraesdaten").mkdir()
new File(dirNumber, "Images").mkdir()
}


In Zeile 3 fehlte noch die "dirBase" .
Ansonsten funktioniert das ganze super.

Ich arbeite noch mit einer Testversion von INTREXX 5.2 .
Januar 2013 wollen wir alles auf richtige Server umstellen.
Bis dahin möchte ich die wichtigsten Apps schon fertig haben.

Jetzt nochmal eine Frage: Die Verzeichnisse die das Script anlegt sind jetzt momentan auf meinem Rechner im Verzeichnis C:/Intrexx//Intrexx/internal/files/... zu finden.
Kann ich (oder Du) das so anpassen das es Unter C:/Daten o.ä. angelegt wird ?

Also ganz großen Dank. Das ist sicher auch für einige andere hier im Forum interessant.

Gruß André
10.11.2012 15:59 von SignMaster
Jetzt nochmal eine Frage: Die Verzeichnisse die das Script anlegt sind jetzt momentan auf meinem Rechner im Verzeichnis C:/Intrexx//Intrexx/internal/files/... zu finden.
Kann ich (oder Du) das so anpassen das es Unter C:/Daten o.ä. angelegt

Klar. Einfach dirBase entspechend anpassen, entweder als relativen Pfad (relativ zum Portal-Verzeichnis, wie oben) oder als absoluten Pfad (z.B. C:/das/verzeichnis).
10.11.2012 19:22 von tyrone
Ich bekomme das doch nicht hin.
Im Anhang mal die App. Bei Deiner klappt es wunderbar.
Wenn ich das bei mir einbaue bekomme ich eine Fehlermeldung.
Das Feld für die Nummer ist da und die GUID im Prozess habe ich auch angepasst. Was mache ich falsch?

Gruß André
10.11.2012 19:34 von SignMaster
Wenn ich das bei mir einbaue bekomme ich eine Fehlermeldung.

Dann müsste doch in den Log-Dateien (
portal.log und/oder
workflow.log) drin stehen, was der Fehler ist?
10.11.2012 21:15 von tyrone
[quote='SignMaster','index.php?page=Thread&postID=30248#post30248']Wenn ich das bei mir einbaue bekomme ich eine Fehlermeldung.

Dann müsste doch in den Log-Dateien (
portal.log und/oder
workflow.log) drin stehen, was der Fehler ist?[/quote]
Also eigentlich möchte ich Dich ja nicht allzusehr belasten.
Habe aber dennoch die Log-Datei angehängt.
Für mich "Böhmische Dörfer"

Gruß André
10.11.2012 21:36 von SignMaster
ERROR 2012-11-10 20:52:04,562 - de.uplanet.lucy.server.SystemLog[WebConnectorWorker-localhost:8102-9]
wfGuid=639EC7888F8E700F260A3C47E5AD32D5807B7ACB wfTitle="Projeknummer-erstellen" wfRun=639EC7888F8E700F260A3C47E5AD32D5807B7ACB-1352565076688 wfPhase=endWorkflow: Cannot complete workflow.
de.uplanet.lucy.server.workflow.WorkflowException: de.uplanet.jdbc.StandardDbException: Error: -1, SQLState: 42X04: Die Spalte 'STR_NUMMER' ist in keiner Tabelle der FROM-Liste enthalten, erscheint in einer Verknüpfungsspezifikation und befindet sich außerhalb des Geltungsbereichs derselben oder erscheint in einer HAVING-Klausel und ist nicht in der 'GROUP BY'-Liste enthalten. Wenn es sich um eine Anweisung CREATE oder ALTER TABLE handelt, ist 'STR_NUMMER' keine Spalte in der Zieltabelle.


SELECT MAX (STR_NUMMER) FROM DATAGROUP('8E1053075D697C29346DA3368DA756AB088C9ADD')

Du musst also in der SQL-Abfrage noch den Spaltennamen ändern, so dass er dem in Deiner Datenbank entspricht.
10.11.2012 21:57 von tyrone
[quote]ERROR 2012-11-10 20:52:04,562 - de.uplanet.lucy.server.SystemLog[WebConnectorWorker-localhost:8102-9]
wfGuid=639EC7888F8E700F260A3C47E5AD32D5807B7ACB wfTitle="Projeknummer-erstellen" wfRun=639EC7888F8E700F260A3C47E5AD32D5807B7ACB-1352565076688 wfPhase=endWorkflow: Cannot complete workflow.
de.uplanet.lucy.server.workflow.WorkflowException: de.uplanet.jdbc.StandardDbException: Error: -1, SQLState: 42X04: Die Spalte 'STR_NUMMER' ist in keiner Tabelle der FROM-Liste enthalten, erscheint in einer Verknüpfungsspezifikation und befindet sich außerhalb des Geltungsbereichs derselben oder erscheint in einer HAVING-Klausel und ist nicht in der 'GROUP BY'-Liste enthalten. Wenn es sich um eine Anweisung CREATE oder ALTER TABLE handelt, ist 'STR_NUMMER' keine Spalte in der Zieltabelle.


SELECT MAX (STR_NUMMER) FROM DATAGROUP('8E1053075D697C29346DA3368DA756AB088C9ADD')

Du musst also in der SQL-Abfrage noch den Spaltennamen ändern, so dass er dem in Deiner Datenbank entspricht.[/quote]Ok. Ich habe das Script angepasst. Mit dem Editor geht das ja komfortabel.
Dennoch will es partout nicht laufen.
Ich habe nochmal die logdatei angehängt. Irgendwo ist da ein Problem mit "strThisYear"
In der Projektdatenbank ist noch kein Datensatz vorhanden.

Was mich auch mal interessiert: bei Deiner Datenbank stehen die Spaltennamen ganz sauber drin "
STR_NUMMER"
Lege ich eine Datenbank im Portalmanager an und füge in die Eingabeseite Felder ein dan sind da immer noch Zahlenkombinationen hinter. "
STR_PROJEKTNR_D7D993FC
"
11.11.2012 07:33 von SignMaster
Ich habe nochmal die logdatei angehängt. Irgendwo ist da ein Problem mit "strThisYear"
In der Projektdatenbank ist noch kein Datensatz vorhanden.


Caused by: groovy.lang.MissingPropertyException: No such property: strThisYear for class: script15EB8BBA6196212B28BE6BBA0DFAB92C36A1E89C
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:49)

Stimmt. Beim Umbauen hatte ich versehentlich die Zeile

def strThisYear = now().format("yyyy")

in den if-Block verschoben. Deshalb ist die Variable im else-Block nicht definiert. Wenn Du die Zeile vor den if-Block setzt, dürfte der Fehler nicht mehr auftreten.

Was mich auch mal interessiert: bei Deiner Datenbank stehen die Spaltennamen ganz sauber drin "STR_NUMMER"
Lege ich eine Datenbank im Portalmanager an und füge in die Eingabeseite Felder ein dan sind da immer noch Zahlenkombinationen hinter. "STR_PROJEKTNR_D7D993FC"

Wenn man im Manager ein neues Datenfeld anlegt, kann man über den Expert-Dialog selbst einen Datenfeldnamen vergeben. Nachdem die Applikation gespeichert wurde, ist dies aber nicht mehr so einfach möglich. Dann muss man entweder
  • das Feld in der Applikation und in der Datenbank (auch Metadaten) ändern oder
  • die Applikation ändern, lokal speichern, auf dem Server löschen und dann neu veröffentlichen.

Letzteres ist aber nur zu empfehlen, wenn keine Abhängigkeiten bestehen. Rechte und Daten der Applikation werden mit gelöscht.
11.11.2012 12:06 von tyrone
Hallo tyrone,

Vielen Dank für Deine Mühe, jetzt hat es endlich geklappt. thumbsup
Ich werde das ganze auch nochmal zusammenfassend hier hochladen.

Im Prinzip ist es ja so , wenn ein Problem gelöst ist, steht man automatisch vor dem nächsten. Ansonsten wäre die Aplikation ja fertig huh

Mir fällt schlagartig ein.
Wie viele dieser Ordner kann ich in ein Verzeichnis speichern. Brauche ich eine Routine die einen Ordner anlegt wenn ein neues Jahr anfängt und die Projektordner automatisch in selbige legt.

Wie kann ich vermeiden das ein Ordner versehentlich überschrieben wird.

Also da sind noch Fragen offen,
aber dazu später.
Jetzt erstmal allen und vor allen Dingen Dir tyrone ein schönes Wochenende
Gruß André
11.11.2012 12:26 von SignMaster
Zurück | Alles über Intrexx | Impressum | Datenschutzerklärung

Über United Planet
© 2019 United Planet GmbH
Schnewlinstraße 2
79098 Freiburg