| |
 | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
 | Phoenix/PDM-Lösung mit Anbindung ans ERP - Abläufe optimieren , ein Anwenderbericht
|
Autor
|
Thema: Ident generieren (in DB) (916 mal gelesen)
|
AWagner Mitglied Software-engineer

 Beiträge: 32 Registriert: 27.11.2007
|
erstellt am: 30. Jun. 2008 17:09 <-- editieren / zitieren --> Unities abgeben:         
Hallo Leute, ich wollte mal fragen ob von euch jemand weiß ob es eine Stored Procedure gibt die einen Ident generieren kann. So wie es auch die Funktion aim_generate_aimkey gibt - die mir einen neuen aimkey erstellt. Warum ich die Funktion brauche: ich möchte meine PSP-Datenbank mit einer anderen Datenbank synchronisieren. Wenn also in der externen DB eine Organisation dazugekommen ist muss ich in meiner PSP-DB ein Insert durchführen. Den Aimkey lass ich mir von der aim_generate_aimkey erstellen - jedoch ist auch der IDENT unique. Also brauche ich eine Funktion die mir aus dem zB. Org-00112 ein Org-00113 generiert. Wär toll wenn mir jemand weiterhelfen könnte. mfg Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
T to the F Mitglied
 
 Beiträge: 398 Registriert: 06.06.2007 Win 7 x64 SP1 PrDS 2012 Ultimate Vault Pro 2012 i7 M640 8 GB Quadro FX 1800M
|
erstellt am: 01. Jul. 2008 08:46 <-- editieren / zitieren --> Unities abgeben:          Nur für AWagner
Hi, also innerhalb von Compass kannst du dir den IDENT ausgeben lassen mit #(GetMaxKey IDENT="Org-00000" 4 5) und dann den Wert hochzählen. Ich würde die Stored Procedure so machen: Einen select max auf den ident machen in der tabelle wo dus brauchst: etwa so...: SELECT MAX (IDENT) FROM dbo.DOCUMENT WHERE IDENT IS NOT NULL das in eine Variable schreiben und +1 machen und fertig... ich hoffe das entspricht etwas was du dir vorstellst.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AWagner Mitglied Software-engineer

 Beiträge: 32 Registriert: 27.11.2007
|
erstellt am: 01. Jul. 2008 09:20 <-- editieren / zitieren --> Unities abgeben:         
Hy, ja die Funktion - "#(GetMaxKey IDENT="Org-00000" 4 5)" kenn ich - kann ich aber hier nicht benutzen da die Synchronisation rein auf Datenbankebene geschehen soll. bezüglich deinem Vorschlag: ich kann doch keinen String + 1 zählen! oder doch? (mit den Typkonvertierungen in TSQL hab ich noch etwas probleme) Hab folgendes versucht: DECLARE @Ident as varchar(15); SELECT @Ident = MAX(IDENT) FROM CONTACT WHERE IDENT IS NOT NULL PRINT @Ident; SET @Ident = @Ident + 1 --Folgender Fehler: Fehler beim Konvertieren des varchar-Wertes 'PER-0001' in den int-Datentyp. PRINT @Ident;
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
T to the F Mitglied
 
 Beiträge: 398 Registriert: 06.06.2007 Win 7 x64 SP1 PrDS 2012 Ultimate Vault Pro 2012 i7 M640 8 GB Quadro FX 1800M
|
erstellt am: 02. Jul. 2008 09:47 <-- editieren / zitieren --> Unities abgeben:          Nur für AWagner
Boah... So ich hab etz weng getüftelt^^ Code:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GetParent]') AND type in (N'P', N'PC')) DROP PROCEDURE [dbo].[GetParent] GO CREATE PROCEDURE GetParent @Ident INT OUTPUT AS BEGIN SELECT @Ident= MAX (CAST((SUBSTRING (IDENT,5,7)) as int)) FROM DOCUMENT WHERE IDENT IS NOT NULL AND IDENT LIKE 'TRA-%'; SET @Ident = @Ident +1 SELECT REPLACE(STR(@Ident,7),' ',0) AS RetValue END
Du musst: FROM DOCUMENT in dein FROM CONTACT oder so umändern und des 'TRA-%' mit 'ORG-%' oder was du brauchst ersetzten.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AWagner Mitglied Software-engineer

 Beiträge: 32 Registriert: 27.11.2007
|
erstellt am: 02. Jul. 2008 10:31 <-- editieren / zitieren --> Unities abgeben:         
Hey, wow, vielen dank ... ne schöne, einfache, kurze Lösung ... hab mich gestern noch ziemlich lange mit dem Problem rumgeschlagen und bin auf eine ziemlich komplizierte und lange Variante gekommen. in einer eigenen Procedure CREATEIDENT mit Input+Outputwert @Startwert SET @Count = LEN(@Startwert); SET @Ident = SUBSTRING(@Startwert, @Count-1, @Count) WHILE ISNUMERIC(@Ident) = 1 BEGIN SET @Count = @Count - 1 SET @Ident = SUBSTRING(@Startwert, @Count-1, @Count) END SET @Ident = SUBSTRING(@Startwert, 1,@Count) SET @Temp = SUBSTRING(@Startwert, @Count + 1, LEN(@Startwert) - @Count); SET @Zahl = CAST(@Temp as int); --CONVERT(int, SUBSTRING(@Startwert, @Count + 1, LEN(@Startwert) - @Count - 1)) SET @Zahl = @Zahl + 1 SET @TempZahl = FLOOR(log10(@Zahl)) SET @Ident = @Ident + REPLICATE(0,LEN(@Startwert)-@Count-FLOOR(log10(@Zahl))-1) + STR(@Zahl, @TempZahl + 1); einziger vorteil dabei - der Inputwert (@Startwert) kann dynamisch sein (ORG-xxx | PER-xxxxx | A-xxx) Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangE Mitglied
   
 Beiträge: 1006 Registriert: 29.01.2003
|
erstellt am: 02. Jul. 2008 12:05 <-- editieren / zitieren --> Unities abgeben:          Nur für AWagner
Spät aber doch noch eine andere Variante. Stammt zwar noch aus Compass2000-zeiten, könnte aber immer noch funktionieren, einfach mal testen: Declare @myStartKey varchar(2048) --Startwert für den IDENT. Entweder fix mitgeben oder z.B. alla "Select Max(IDENT) From VIEW_CONTACT Where ENTITY_TYPE = 'AIM.CONTACT'" auslesen. Geschmack- und Performance-Sache; DECLARE @table varchar(128) DECLARE @range char(1) DECLARE @colid varchar(2048) DECLARE @collen varchar(512) SET @myNewIdent = 'ORG-00001' -- Startwert für die Ident-Generierung SET @table = 'VIEW_ALL_CONTACT' SET @range = '0' /* 0 = numerisch (0-9) a = Kleinbuchstaben (a-z) A = Großbuchstaben (A-Z) x = alphanumerisch (0-9 und a-z) */ SET @colid = 'IDENT' SET @collen = '15' -- Länge des IDENT-Feldes, bei Bedarf anpassen; EXEC aim_create_key @myNewIdent OUTPUT , @table, @range, @colid, @collen Set @myNewIdent = CONVERT(nvarchar,@myNewIdent) --Ident generiert in: @myNewIdent Ciao, WolfgangE
------------------ An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!! [Diese Nachricht wurde von WolfgangE am 02. Jul. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AWagner Mitglied Software-engineer

 Beiträge: 32 Registriert: 27.11.2007
|
erstellt am: 02. Jul. 2008 12:42 <-- editieren / zitieren --> Unities abgeben:         
Juhuuu, ... genau das wollte ich wissen. Hab mir schon fast gedacht das evt. die Funktion aim_create_key die gute ist  Jedoch wusste ich nicht mit welchen werten ich sie füttern muss um zum gewünschten ergebniss zu kommen. Hab einige varianten ausprobiert - hatte aber nie erfolg. Vielen Dank euch beiden. Ne kurze Frage hab ich aber noch. Ist es nicht vielleicht besser als @Table die Tabelle dbo.CONTACT anzugeben? Der View VIEW_ALL_CONTACT muss ja aus 2 Tabellen aufgebaut werden. Müsste Performancemässig schneller sein oder? mfg Andreas Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangE Mitglied
   
 Beiträge: 1006 Registriert: 29.01.2003
|
erstellt am: 02. Jul. 2008 20:24 <-- editieren / zitieren --> Unities abgeben:          Nur für AWagner
Zitat: Original erstellt von AWagner:
Ne kurze Frage hab ich aber noch. Ist es nicht vielleicht besser als @Table die Tabelle dbo.CONTACT anzugeben? Der View VIEW_ALL_CONTACT muss ja aus 2 Tabellen aufgebaut werden. Müsste Performancemässig schneller sein oder?mfg Andreas
so isses du könntest höchstens noch überlegen, anstatt der ganzen Tabelle CONTACT die View VIEW_CONTACT_PERSON bzw. VIEW_CONTACT_ORGANISATION zu verwenden, was eben brauchst. Je nach Datenmenge bei euch könnte das dann doch noch performanter sein als die CONTACT-Tabelle. Musst ausprobieren. Ciao, WolfgangE ------------------ An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!! [Diese Nachricht wurde von WolfgangE am 02. Jul. 2008 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ShadowWriter Mitglied

 Beiträge: 20 Registriert: 27.08.2007
|
erstellt am: 17. Jul. 2008 20:44 <-- editieren / zitieren --> Unities abgeben:          Nur für AWagner
Hallo WolfgangE, da hat man dann aber keinen wirklichen Geschwindigkeitsvorteil. Eine Einschränkung durch den ENTITY_TYPE wäre dann doch Sinnvoller. Das ist auch in einem Beispiel am Anfang dieses Treaths wo der IDENT über die DOCUMENT Tabelle erzeugt wird zwingend nötig, da sonst die IDENT Generierung über alle Dokumente (Konst.Dok, Office.Dok,Secondary.Dok) geht und das zu Fehlern führen kann. ------------------ einen schönen Tag noch... ShadowWriter und angenehme Träume Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
WolfgangE Mitglied
   
 Beiträge: 1006 Registriert: 29.01.2003
|
erstellt am: 18. Jul. 2008 13:03 <-- editieren / zitieren --> Unities abgeben:          Nur für AWagner
völlig richtig, ShadowWriter, genau so ist es. Aber weil grad von Performance die Rede ist. Wenn diese Form der Ident-Generierung für mehrere Datensätze in Folge verwendet wird, z.B. innerhalb einer Schleife,, lässt sich die Prozedur maßgeblich beschleunigen, indem der jeweils zuletzt erzeugte Ident als neuer StartKey für den nächsten Durchlauf verwendet wird. Ciao, WolfgangE ------------------ An Optimist Is A Person Who Has Not Been Shown All The Facts Yet!!! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
AWagner Mitglied Software-engineer

 Beiträge: 32 Registriert: 27.11.2007
|
erstellt am: 02. Okt. 2009 15:14 <-- editieren / zitieren --> Unities abgeben:         
Hallo Leute, ich bin gerade auf PSP 2010 umgestiegen und habe nun ein Problem mit der aim_create_key - Funktion! Diese hat sich nämlich geändert! es ist ein zusätzlicher Parameter hinzugekommen! - @cacheargs Leider weis ich nicht welche Eingangsparameter dieses Argument benötigt damit ich wieder einen korrekten Key bekomme! Würde ich dringend brauchen weil sonst die Synchronisation zu einer anderen Datenbank still steht!  Kann mir vielleicht jemand helfen? Vielen dank schon mal !! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |