MS SQL Server: Split/Explode für SQL

Aufgabenstellung

Eine Spalte einer Tabelle beinhaltet eine Auflistung, die durch ein Zeichen getrennt ist. Im Beispiel die Spalte Gruppe.

Nr|Gruppe
-------------------------------
1 | Buerste,Besen,Feger
2 | Eier,Salz,Butter
3 | Bier,Schnaps,Wein 

Es soll nun mit einer Art Split/Explode wie in PHP die Spalte aufgesplittet werden und einzelne Werte ausgegeben werden

Ansatz

Der folgende Code erstellt eine Funktion, die für eine Datenbank gilt. Kopiert man diesen Code in das SQL Server Management Studio und führt ihn mit F5 aus, erhält die ausgewählte Datenbank die Funktion Split.

Lösung

CREATE FUNCTION [dbo].[split](@String varchar(8000), @Delimiter varchar(12), 
                                                 @returnItem int)
RETURNS varchar(8000)
AS
BEGIN
	DECLARE @id int
	DECLARE @idx int
	DECLARE @slice varchar(8000)
	DECLARE @returnslice varchar(8000)

	SET @id = 0
	SET @idx = 1
	SET @returnslice = null
	
	WHILE @idx!= 0
	BEGIN
		SET @id = @id + '1'
		SET @idx = charindex(@Delimiter,@String)

		IF @idx!=0
			SET @slice = left(@String,@idx - 1)
		ELSE
			SET @slice = @String

		IF @id = @returnItem SET @returnslice = @slice
		SET @String = SUBSTRING(right(@String,len(@String) - @idx),
                                                  len(@Delimiter), len(@String))

		IF len(@String) = 0 BREAK
	END
	RETURN @returnslice
END

Aufruf mit:

SELECT dbo.split('DIES/IST/EIN/TEST','/',2)

MS SQL Server: Ergebnisvariable aus EXEC SQL-Statement

Aufgabenstellung

Aus einem normalen SQL Statement, welches mit EXEC ausgeführt wird, soll eine Ergebnisvariable in dem „normalen“ TSQL-Skript weiterverwendet werden.

Ansatz

Hierzu wird der Rückgabewert des EXEC Statements in eine Variable geschrieben.

Lösung

SET @sql2='SELECT COUNT(*) FROM users WHERE ['+@forsheet+']=1'
		
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES 
                WHERE TABLE_NAME = 'ResultSet') 
DROP TABLE ResultSet;
		
CREATE TABLE ResultSet (mycount int)
 
INSERT INTO ResultSet
EXEC sp_executesql @sql2
		
SELECT @isdrin=mycount FROM ResultSet

VBA und SAP: Funktionsbausteine aufrufen

Aufgabenstellung

Die Aufgabenstellung sowie der Ansatz ist identisch mit diesem Artikel (Bitte zuerst lesen).

Prämissen / Vorraussetzungen

Die Datei librfc32.dll muss im VBA Editor eingebunden werden (sie ist nach der Installation der SAPGUI verfügbar).

Lösung

Aufbau der Verbindung

Public Function SAP_Logon(username As String, password As String) As Boolean
'*************************************************
'  ANMELDUNG AN SAP
'  ACHTUNG: USER MUSS BERECHTIGUNGEN HABEN!!!!
'*************************************************

    Set FunctionCtrl = CreateObject("SAP.Functions")
    'Objekt für die SAP Verbindung

    Set SapConnection = FunctionCtrl.Connection
   
    SapConnection.Client = "100"
    SapConnection.User = username
    SapConnection.Language = "DE"
    SapConnection.password = password
    
     SapConnection.hostname = "rechnername.firma.com" 'nicht das kuerzel wie DE9
    
    SapConnection.systemnumber = "0"

    If Not SapConnection.Logon(0, True) Then 'True silent - false offen
        MsgBox "Logon failed!!!", vbCritical
        CMS_Logon = False
    Else
        CMS_Logon = True
    End If
End Function

Abmelden

Public Function SAP_Logoff() As Boolean
    SapConnection.LogOff
End Function

Funktionbaustein befüllen und aufrufen

Public Function SAP_Create_Request() As Long
'******************************************************
'  Request erzeugen
'  Strukturen füllen und übergeben, dann Log ausgeben
'******************************************************

On Error GoTo ErrorMSG

    Dim FunctionModule As Object
    Dim e_EXPORTSTRUKTUR As Object
    Dim T_TABELLENSTRUKTUR As Object
    
    Dim te_messtab As Object
    
    Dim lCnt As Long

'   Assign Function Module
    Set FunctionModule = FunctionCtrl.Add("Z_FUBA")
    
'   Set export Variables
    Set e_EXPORTSTRUKTUR = FunctionModule.Exports("P_STRUKTURPARAMETER")

' Set structrue fields in export parameter
    e_EXPORTSTRUKTUR ("ZEXPORTPARAM1") = "BLA"
    e_EXPORTSTRUKTUR ("ZEXPORTPARAM1") = "BLA2"

    Set T_TABELLENSTRUKTUR  = FunctionModule.Tables("T_ZMMMATANF8")
    T_TABELLENSTRUKTUR.appendRow
    T_TABELLENSTRUKTUR(1, "SPALTE1") = 1
    T_TABELLENSTRUKTUR(1, "SPALTE2") = 2

    T_TABELLENSTRUKTUR.appendRow
    T_TABELLENSTRUKTUR(2, "SPALTE1") = 3
    T_TABELLENSTRUKTUR(2, "SPALTE2") = 4

'   Call Function Aufruf
    If FunctionModule.Call = True Then
        Set te_messtab = FunctionModule.Tables("TE_MESSTAB")
        ' Meldungen ausgeben:
        
        Dim intRow As Integer
        For intRow = 1 To te_messtab.RowCount
            If te_messtab(intRow, "ARBGB") = "ZMM0001" And _
                te_messtab(intRow, "MSGNR") = "003" Then

                ' ANForderung wurde erstellt.
                CMS_Create_Request = Val(te_messtab(intRow, "MSGV1"))
            End If
            Debug.Print te_messtab(intRow, "ARBGB")
            Debug.Print te_messtab(intRow, "MSGNR")
            Debug.Print te_messtab(intRow, "NATXT_DE")
            sMSGTXT = te_messtab(intRow, "NATXT_DE")
            Debug.Print te_messtab(intRow, "FLDNAME")
            Debug.Print te_messtab(intRow, "MSGV1")
            Debug.Print te_messtab(intRow, "MSGV2")
            Debug.Print te_messtab(intRow, "MSGV3")
            Debug.Print te_messtab(intRow, "MSGV4")
            Debug.Print "----------------------------------"
        Next
    Else
        CMS_Create_Request = 0
         MsgBox "Error creating the CMS Request." & vbNewLine & _
                "See Log for details", vbCritical
    End If
ErrorMSG:
  
End Function

Die Testfunktion

Public Sub Start()
'*************************************************
'  TESTUMGEBUNG
'*************************************************
    Dim RequestNo As Long
    Dim username As String
    Dim password As String
    
    username = "BJOERN"
    password = "ICHBINDERBESTE"
        
    Call CMS_Logon(username, password)
    RequestNo = SAP_Create_Request   
    Call CMS_Logoff
End Sub

Arduino Uno Lichterkette mit Dämmerungssensor

Aufgabenstellung

Für die Ansteuerung externer Elektronikgeräte wird eine programmierbare Lösung gesucht, die auch kabellos per Batterie betrieben werden kann und Eingabewerte (z.B. Sensorwerte) einlesen kann.

Ansatz

Die Verwendung eines Mikrocontrollers ist notwendig. Mikrocontroller sind sehr stromsparende, programmierbare und mobile Systeme, die nur das nötigste an Anschlüssen für das Aufbauen komplexer Elektronikschaltungen besitzen.

Lösung

Auf die Empfehlung eines Elektronikfreaks habe ich mir das Arduino Uno zugelegt. Hierbei handelt es sich um ein programmierbares Board mit 1KByte Flash-Speicher und einer ATMega Prozessor.

Beurteilung

Da man auf einer sehr niedrigen Ebene mit Bauteilen arbeitet, würde sich ein Elektrotechnikgrundkurs anbieten.