Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Zeichen an Position x einfügen und an Position y ersetzen (VBA/SQL)

Begonnen von ReneK, Februar 19, 2019, 10:51:19

⏪ vorheriges - nächstes ⏩

ReneK

Hallo Forum.

Ich bräuchte Hilfe bei zwei Codesnipseln zu folgender Problematik.

1) Mein Feldinhalt besteht aus 22 Zeichen und größer.
Wenn der Inhalt genau 22 Zeichen lang ist, möchte ich an Position 17 zwei beliebige Zeichen (hier im Beispiel -1) einfügen und den Rest nach rechts anhängen.

Beispiel:
xxxxx-xxxxx-xxxxnnnn       -> xxxxx-xxxxx-xxxx-1nnnn
xxxxx-xxxxx-xxxx-2nnnn    -> xxxxx-xxxxx-xxxx-2nnnn


2) Darauf aufbauend möchte ich später auch andere Feldinhalte manipulieren können.
Also z.B. an Stelle der "-2" möchte ich dann "-3" stehen haben.

Vielleicht auch automatisch hochzählen lassen (?). Geht das, oder zu kompilziert??? Wenn ja wie?

Da es sein kann, dass an einer anderen Position schon "-2" vorhanden ist, kann ich mit dem Replace Befehl so nichts anfangen, den ich bisher gefunden habe.


Wer kann mir helfen?

Mit dem Code hier wird das ans Ende geschrieben. Allerdings:
- Bei jedem Datensatz.
- Und nicht an der richtigen Stelle.


  Dim strsqlA4F1 As String
    strsqlA4F1 = "UPDATE ImportA4F SET Feld1 = Feld1 & '_X'"
    CurrentDb.Execute strsqlA4F1, dbFailOnError


In der Theorie könnte es so aussehen. Mit ganz viel ????????? (ich bin da nicht so fit drin):

If len (Feld1)=22 then
'keine Ahnung'
Feld1=Left(Feld1,17) +"-1" + Right(Feld1,4)
'und weiter???
...


Replace Methode, kann ich nicht nutzen, da im ganzen Feldinhalt ersetzt wird.
Hier fehlt mir die Positionsangabe.

  Dim strsqlA4F1 As String
    strsqlA4F1 = "UPDATE ImportA4F SET Feld1 = Replace(Feld1,'-2','-3')"
    CurrentDb.Execute strsqlA4F1, dbFailOnError


Vielen Dank vorab.



MzKlMu

Hallo,
ZitatVielleicht auch automatisch hochzählen lassen (?). Geht das, oder zu kompilziert??? Wenn ja wie?
Da bestehen grundsätzlich zZweifel an der Struktur. Wenn hier was hochgezählt werden soll, so ist für diese Nummer ein extra Feld in einer extra Tabelle zu führen. Als je ein Datensatz.
Wahrscheinlich muss auch der Eintrag (xxxxx-xxxxx-xxxxnnnn) in mehrere Felder aufgeteilt werden.
Du solltest daher das Vorhaben mal genauer erklären.
Gruß Klaus

ReneK

Hallo.

Danke für die Antwort.

Das mit dem Hochzählen muss nicht sein. Bitte streichen.

Primär geht es um das Einfügen von Zeichen und Ersetzen an Position x in einem Feld.

Mmmh, was soll ich da erklären.
Ich habe in einem Feld einen Inhalt den ich so manipulieren muss, wie ich es brauche  ???
Einen Workaround mit Feld trennen, manipulieren und wieder zusammensetzen, und das via VBA halte ich für aufwendig.
Irgend eine Befehlsfolge wird es doch geben?  :o


ebs17

ZitatEinen Workaround mit Feld trennen, manipulieren und wieder zusammensetzen, und das via VBA halte ich für aufwendig.
... und auch schön doof. Drei Schritte vor, drei zurück - da geht es vorwärts.
Daher lautet auch die nachhaltige Empfehlung:
EINMALIG trennen und die atomaren Informationen in separaten TABELLENfeldern speichern. Ein paar Zeichenketten dann einfach zusammensetzen kann jeder, wenn man es denn wirklich zusammengesetzt braucht.
Das haben sogar schon Exceluser verstanden und umgesetzt, die von Normalisierung nicht die geringste Ahnung hatten.

ZitatIch habe in einem Feld einen Inhalt den ich so manipulieren muss, wie ich es brauche
Inhalte zusammenpatschen, mit denen man dann nicht umgehen kann, hältst Du für praktikabel?
Auch wenn man es technisch kann - vom Aufwand und der Performance her ist es ein Schlag ins Wasser.
Mit freundlichem Glück Auf!

Eberhard

ReneK

Zitat
Auch wenn man es technisch kann - vom Aufwand und der Performance her ist es ein Schlag ins Wasser.

Hmmm..., klasse Beitrag.
Ein "Nein, mach ich nicht" hätte da gereicht. Hätt man sich da aber sparen können.
Ein "Nein, geht nicht" wäre ja OK. Wobei ich das anzweifel.

Was ich damit mache ist völlig irrelvant !
Bis zu einem gewissen Grad Änderungen an einen bestehenden / fertigen Projekt vorzunehmen ist ja ok.
Auch die Nachfrage wie die Struktur ist, alles in Ordnung.
Aber grundsätzlich vorab ohne Hintergrundinformationen alles für scheiße zu befinden ist schon befremdlich.

Die nötigen Informationen stehen im ersten Post. Mehr Fragen hatte ich nicht.

Ich denke dafür ist ein Forum da wenn man Fragen hat...




MzKlMu

Hallo,
ZitatReplace Methode, kann ich nicht nutzen, da im ganzen Feldinhalt ersetzt wird.
diese Annahme ist falsch. Replace hat einen Parameter für die Startposition.
Außerdem ist Dein obiges Beispiel falsch.
xxxxx-xxxxx-xxxxnnnn das sind 20 Zeichen und keine 22.
Was stimmt jetzt ?
Gruß Klaus

ebs17

ZitatEin "Nein, geht nicht" wäre ja OK. Wobei ich das anzweifel.
Davon ist nirgendwo die Rede.
Zitat
alles für scheiße zu befinden
Auch davon findest Du nichts geschrieben. Du darfst aber eigene Schlussfolgerungen pflegen.

Wenn Du schlaue, aber anstrengende Lösungen suchst: Reguläre Ausdrücke erfüllen sehr viele komplexe Wünsche, erfordern aber ein gehobenes abstraktes Denken.

Die Begriffe zum Projekt "fertig" (von Dir) und "nachhaltig" (von mir) scheinen hier nicht ganz zu kooperieren.
Mit freundlichem Glück Auf!

Eberhard

nurmikss

Hallo,

ich würde zunächst folgende Vorüberlegung machen:
Wenn Dein Feld mehrere separate Komponenten enthält, mit denen Du später nochmal separate Aktionen durchführen willst, dann würde ich auch empfehlen, das Feld auf mehrere Felder aufzuteilen.

Wenn es nur darum geht, einmalig eine Korrektur an Feldinhalten vorzunehmen, die dann später so stehenbleiben werden, kannst Du Deine Feldinhalte so korrigieren (angenommen, es geht um Felder, die vorher 20 Zeichen lang sind):
Die linken 16 Zeichen plus Dein Einschub plus die restlichen 4 Zeichen sollen der neue Inhalt Deines Feldes werden:
UPDATE Deine_Tabelle
SET Feld_A = left(Feld_A,16) & "-1" & right(Feld_A,4)
WHERE Len(Feld_A)=20;
Ich verwende Microsoft Office Professional plus 2010

ReneK

Hallo nurmikss.

Du hast mich einen Schritt weitergebracht !
Das ist genau das was ich brauche. Und es funktioniert.

Durch die Importdaten ist das ein immer wiederkehrender Vorgang in den Tabellen, und der Update ist die einfachste Lösung.

Ich hatte jetzt noch Probleme das ins VBA zu übersetzen. Da bekam ich Syntax und / oder Operatorenfehler.
Mit den Hochkommata steh ich auf Kriegsfuß.

SQL

UPDATE ImportA4F SET Feld1 = left(Feld1,15) & "_1" & right(Feld1,4)
WHERE Len(Feld1)=19;


VBA

Dim strsqlA4F1 As String
strsqlA4F1 = "UPDATE ImportA4F SET Feld1 = left(Feld1,15) & ' _1' & right(Feld1,4) WHERE Len(Feld1)=19"
CurrentDb.Execute strsqlA4F1, dbFailOnError


Danke.  ;D

nurmikss

Bei der Umsetzung in VBA brauchen wir beide Hilfe von den Profis.
Ich verwende Microsoft Office Professional plus 2010

DF6GL

Hallo,

sinnvoll wäre, den vollständigen Code ( die vollständigen Prozeduren) zu posten
und vernünftige, aussagekräftige Feldnamen zu verwenden....
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

nurmikss

Das muss hier ReneK liefern.

Ich sehe für mich da eine Verbindung zu meinem Thema https://www.access-o-mania.de/forum/index.php?topic=23796.0 (Leerzeichenhäufung durch RegEx beseitigen), wo ich die Funktion in der VAB-Umgebung von Hand an einem Einzelfall aufrufen kann, aber noch nicht weiß, wie ich das jetzt auf eine ganze Tabelle anwende. Antworten speziell zu meinem Thema bitte nur dort.

Wahrscheinlich braucht es in beiden Fällen nur noch einen kleinen methodischen Hinweis (hoffe ich).
Ich verwende Microsoft Office Professional plus 2010

ReneK

Hallo.

Vielen Dank, dass sich noch jemand drum kümmern möchte.
Aber meine Fragen sind beantwortet, bzw. es ist erledigt.
Für Frage 2 habe ich einen unique String gefunden, den ich wie gehabt ersetzen kann.

Den Knopp um das Thema auf erledigt zu setzen suche ich noch.  8) :o

Danke.

nurmikss

Zitat
Den Knopp um das Thema auf erledigt zu setzen suche ich noch.
Der sollte schräg links unter der Antwortschaltfläche sein: [Topic solved].
Ich verwende Microsoft Office Professional plus 2010

ReneK