This commit is contained in:
2026-07-19 23:30:33 +02:00
parent 718115a1e4
commit cf75d131cc
12 changed files with 1273 additions and 778 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -127,6 +127,89 @@
<value>431, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="ToolStripMenuItem3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
AElFTkSuQmCC
</value>
</data>
<data name="ToolStripMenuItem2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAYAAAByDd+UAAAABGdBTUEAALGOfPtRkwAAACBjSFJNAACH

View File

@@ -3652,21 +3652,24 @@ Public Class usrCntlSpeditionsBuchSuche
Me.Cursor = Cursors.Default
End Sub
Private Sub ToolStripMenuItem2_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem2.Click
Private Sub ToolStripMenuItem2_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem2.Click, ToolStripMenuItem3.Click
Try
Dim kdNr = -1
If sender Is ToolStripMenuItem2 Then
kdNr = 770931 'KANADEVIA
End If
Me.Cursor = Cursors.WaitCursor
Dim RPT As New cSpeditionsbuchReport
If CheckBox4.Checked Then
RPT.RunReport_VERAG_ZA_DETAIL_FULL(770931, CDate(txtAbfertDat.Text), CDate(txtAbfertDatBis.Text), getSpedBuchWhere,, getSpedbuchList)
RPT.RunReport_VERAG_ZA_DETAIL_FULL(kdNr, CDate(txtAbfertDat.Text), CDate(txtAbfertDatBis.Text), getSpedBuchWhere,, getSpedbuchList)
ElseIf cbxDetailbericht.Checked Then
RPT.RunReport_VERAG_ZA_DETAIL(770931, CDate(txtAbfertDat.Text), CDate(txtAbfertDatBis.Text), getSpedBuchWhere, , getSpedbuchList)
RPT.RunReport_VERAG_ZA_DETAIL(kdNr, CDate(txtAbfertDat.Text), CDate(txtAbfertDatBis.Text), getSpedBuchWhere, , getSpedbuchList)
Else
RPT.RunReport_VERAG_ZA_GENERAL(770931, CDate(txtAbfertDat.Text), CDate(txtAbfertDatBis.Text), getSpedBuchWhere,, CheckBox5.Checked, getSpedbuchList)
RPT.RunReport_VERAG_ZA_GENERAL(kdNr, CDate(txtAbfertDat.Text), CDate(txtAbfertDatBis.Text), getSpedBuchWhere,, CheckBox5.Checked, getSpedbuchList)
End If
@@ -3678,6 +3681,10 @@ Public Class usrCntlSpeditionsBuchSuche
Me.Cursor = Cursors.Default
Exit Sub
Exit Sub
Exit Sub
Exit Sub
@@ -3976,13 +3983,7 @@ Public Class usrCntlSpeditionsBuchSuche
Me.Cursor = Cursors.Default
End Sub
Private Sub DataGridView_CellContentClick(sender As Object, e As DataGridViewCellEventArgs)
End Sub
Private Sub ToolStripMenuItem14_Click(sender As Object, e As EventArgs) Handles ToolStripMenuItem14.Click
End Sub
End Class
Class cSpeditionsbuchReport
@@ -4135,8 +4136,8 @@ Class cSpeditionsbuchReport
"FROM Speditionsbuch " &
"INNER JOIN [Abfertigungsarten] " &
" ON Speditionsbuch.Abfertigungsart = Abfertigungsarten.Abfertigungsart " &
"WHERE (EmpfängerKundenNr IN (" & KDNR & ") OR VermittlerKundenNr IN (" & KDNR & ")) " &
" AND Abfertigungsdatum BETWEEN '" & AbfVon.ToShortDateString & "' AND '" & AbfBis.ToShortDateString & "' " &
"WHERE 1=1 AND" & If(KDNR > 0, " (EmpfängerKundenNr IN (" & KDNR & ") OR VermittlerKundenNr IN (" & KDNR & ")) AND ", "") &
" Abfertigungsdatum BETWEEN '" & AbfVon.ToShortDateString & "' AND '" & AbfBis.ToShortDateString & "' " &
" AND isAbfertigung = 1 "
Return SQL.loadDgvBySql_Param(sqlText & " " & whereStr, "FMZOLL",, list)

View File

@@ -389,8 +389,9 @@ Public Class usrCntlATLAS_EZA
' cdy.EZA_AbgangsDienststellennummer = "DE004102"
'frmZollanmeldung.setAbgangszollstelle(cdy.eza_Eingangszollstelle, AVISO)
frmZollanmeldung.setZollstelle(cdy.eza_AdressierteZollstelle, AVISO)
If cdy.eza_AdressierteZollstelle IsNot Nothing AndAlso cdy.eza_AdressierteZollstelle.Length = 8 Then 'nur 4 stellen erlaubt!! 'DE00 fällt weg
EZA.eza_AdressierteZollstelle = cdy.eza_AdressierteZollstelle.Substring(4, 4)
If cdy.eza_AdressierteZollstelle IsNot Nothing AndAlso cdy.eza_AdressierteZollstelle.trim.Length = 8 Then 'nur 4 stellen erlaubt!! 'DE00 fällt weg
EZA.eza_AdressierteZollstelle = cdy.eza_AdressierteZollstelle.trim.Substring(4, 4)
End If
' cdy.EZA_VersendungsLandCode = "DE"

View File

@@ -44,6 +44,8 @@ Public Class cGlobal
Public Const SND_Status_Ankunft = 3 '?
Public Shared CHAT_NurGelesen = False
Shared Function getStatusText(i As Integer) As String
Select Case i
Case 0 : Return "Erfasst"

View File

@@ -1070,7 +1070,7 @@ Public Class SQL
End Function
Public Function loadDgvBySql_Param(ByVal sql As String, Optional conn_art As String = "SDL", Optional timeout As Integer = 0, Optional list As List(Of SQLVariable) = Nothing, Optional showErr As Boolean = True, Optional ByRef errOccured As Boolean = False) As DataTable
Public Function loadDgvBySql_Param(ByVal sql As String, Optional conn_art As String = "SDL", Optional timeout As Integer = 0, Optional list As List(Of SQLVariable) = Nothing, Optional showErr As Boolean = True, Optional ByRef errOccured As Boolean = False, Optional ByRef maxVersuche As Integer = 3) As DataTable
Try
Dim myTable = New DataTable()
Dim conn As New SqlConnection
@@ -1088,20 +1088,46 @@ Public Class SQL
Case "WEB" : conn = GetNewOpenConnectionWEB()
End Select
' Using conn As SqlConnection = GetNewOpenConnection()
Using cmd As New SqlCommand(sql, conn)
If list IsNot Nothing Then
For Each i In list
'MsgBox(i.Text.trim & " " & IIf(i.Value Is Nothing, DBNull.Value, i.Value))
cmd.Parameters.AddWithValue("@" & i.Scalarvariable.trim, IIf(i.Value Is Nothing, DBNull.Value, i.Value))
Next
End If
If timeout > 0 Then cmd.CommandTimeout = timeout
Dim dr As SqlDataReader = cmd.ExecuteReader()
Dim versuch As Integer = 0
Do
versuch += 1
Try
Using cmd As New SqlCommand(sql, conn)
If list IsNot Nothing Then
For Each i In list
cmd.Parameters.AddWithValue("@" & i.Scalarvariable.Trim, If(i.Value Is Nothing, DBNull.Value, i.Value))
Next
End If
If timeout > 0 Then cmd.CommandTimeout = timeout
Using dr As SqlDataReader = cmd.ExecuteReader()
myTable.Load(dr)
End Using
End Using
Exit Do ' Erfolgreich
Catch ex As SqlException When ex.Number = 1205 AndAlso versuch < maxVersuche
If versuch >= maxVersuche Then Throw
Threading.Thread.Sleep(200 * versuch)
End Try
Loop
'' Using conn As SqlConnection = GetNewOpenConnection()
'Using cmd As New SqlCommand(sql, conn)
'If list IsNot Nothing Then
' For Each i In list
' 'MsgBox(i.Text.trim & " " & IIf(i.Value Is Nothing, DBNull.Value, i.Value))
' cmd.Parameters.AddWithValue("@" & i.Scalarvariable.trim, IIf(i.Value Is Nothing, DBNull.Value, i.Value))
' Next
'End If
'If timeout > 0 Then cmd.CommandTimeout = timeout
'Dim dr As SqlDataReader = cmd.ExecuteReader()
'myTable.Load(dr)
' dr.Close()
myTable.Load(dr)
dr.Close()
End Using
conn.Close()
' End Using
Return myTable 'While Schleife wird hier verlassen

View File

@@ -24,6 +24,7 @@ Partial Class frmMessenger
'Das Bearbeiten mit dem Code-Editor ist nicht möglich.
<System.Diagnostics.DebuggerStepThrough()>
Private Sub InitializeComponent()
Me.components = New System.ComponentModel.Container()
Dim DataGridViewCellStyle1 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle()
Dim DataGridViewCellStyle2 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle()
Dim DataGridViewCellStyle3 As System.Windows.Forms.DataGridViewCellStyle = New System.Windows.Forms.DataGridViewCellStyle()
@@ -38,12 +39,12 @@ Partial Class frmMessenger
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(frmMessenger))
Me.SplitContainer = New System.Windows.Forms.SplitContainer()
Me.SplitContainer2 = New System.Windows.Forms.SplitContainer()
Me.dgvChats = New VERAG_PROG_ALLGEMEIN.MyDatagridview()
Me.dgvChats = New VERAG_PROG_ALLGEMEIN.MyDatagridview(Me.components)
Me.Panel6 = New System.Windows.Forms.Panel()
Me.Label3 = New System.Windows.Forms.Label()
Me.lblLKWChat_MsgCntInaktiv = New System.Windows.Forms.Label()
Me.cbxInaktiveChats = New System.Windows.Forms.CheckBox()
Me.DGVSonstige = New VERAG_PROG_ALLGEMEIN.MyDatagridview()
Me.DGVSonstige = New VERAG_PROG_ALLGEMEIN.MyDatagridview(Me.components)
Me.Panel5 = New System.Windows.Forms.Panel()
Me.MyTextBox2 = New VERAG_PROG_ALLGEMEIN.MyTextBox()
Me.PictureBox2 = New System.Windows.Forms.PictureBox()
@@ -64,7 +65,7 @@ Partial Class frmMessenger
Me.btnNeu = New System.Windows.Forms.Button()
Me.Button1 = New System.Windows.Forms.Button()
Me.SplitContainer1 = New System.Windows.Forms.SplitContainer()
Me.MyFlowLayoutPanel1 = New VERAG_PROG_ALLGEMEIN.MyFlowLayoutPanel()
Me.MyFlowLayoutPanel1 = New VERAG_PROG_ALLGEMEIN.MyFlowLayoutPanel(Me.components)
Me.UsrCntlMessenger_ChatElement1 = New VERAG_PROG_ALLGEMEIN.usrCntlMessenger_ChatElement()
Me.Panel3 = New System.Windows.Forms.Panel()
Me.btnTeilnehmer = New System.Windows.Forms.Button()
@@ -92,9 +93,9 @@ Partial Class frmMessenger
Me.btnSendAtt = New System.Windows.Forms.Button()
Me.btnSenden = New System.Windows.Forms.Button()
Me.rtbChatMessage = New System.Windows.Forms.RichTextBox()
Me.TimerNEW_MESSAGE = New System.Windows.Forms.Timer()
Me.Timer_REFRESH = New System.Windows.Forms.Timer()
Me.cntxt = New System.Windows.Forms.ContextMenuStrip()
Me.TimerNEW_MESSAGE = New System.Windows.Forms.Timer(Me.components)
Me.Timer_REFRESH = New System.Windows.Forms.Timer(Me.components)
Me.cntxt = New System.Windows.Forms.ContextMenuStrip(Me.components)
Me.ChatDeaktivierenToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.toolChatReminder = New System.Windows.Forms.ToolStripMenuItem()
Me.DataGridViewTextBoxColumn1 = New System.Windows.Forms.DataGridViewTextBoxColumn()

View File

@@ -160,8 +160,11 @@ Public Class frmMessenger
End If
End Sub
Sub intiDGVChats(Optional dgv_ChatID = -1, Optional reloadChat = True, Optional selFirst = False)
Public Sub intiDGVChats(Optional dgv_ChatID = -1, Optional reloadChat = True, Optional selFirst = False, Optional Chat_ART = "")
If Chat_ART <> "" Then
initChat_ART(Chat_ART)
End If
Dim newMsg = VERAG_PROG_ALLGEMEIN.cMessenger.GET_NewMSG_COUNT_ART(VERAG_PROG_ALLGEMEIN.cAllgemein.USRID, "CHAT")
UsrCntlChat_Art_Btn_MACHAT.setCnt(newMsg)
@@ -1336,7 +1339,7 @@ Public Class frmMessenger
If r.Cells("clmnMaId").Value <> VERAG_PROG_ALLGEMEIN.cAllgemein.USRID Then
For Each MB In CHAT.CHAT_MEMBERS
If r.Cells("clmnMaId").Value = MB.chatMb_maId Then
ol.Add(MB)
ol.Remove(MB)
End If
Next
End If

View File

@@ -6,7 +6,7 @@ Public Class usrCntlMessenger_ListNewChats
Dim SQL As New VERAG_PROG_ALLGEMEIN.SQL
Sub intiDGVChats(Optional dgv_ChatID = -1, Optional reloadChat = True, Optional selFirst = False)
Sub intiDGVChats(Optional dgv_ChatID = -1, Optional reloadChat = True, Optional selFirst = False, Optional GeleseneAnzeigen = True)
@@ -16,6 +16,19 @@ Public Class usrCntlMessenger_ListNewChats
' loaded = False
'End If
' Merke zuvor ausgewählte ab_id (wenn genau eine Zeile selektiert)
Dim prevSelectedId As Integer = -1
Try
If .SelectedRows.Count = 1 Then
Dim v = .SelectedRows(0).Cells("chat_id").Value
If v IsNot Nothing AndAlso v IsNot DBNull.Value AndAlso IsNumeric(v) Then
prevSelectedId = CInt(v)
End If
End If
Catch
prevSelectedId = -1
End Try
Dim whereName = ""
'If MyTextBox1.Text.Trim <> String.Empty Then
' whereName = " WHERE y.chat_name LIKE '%" & MyTextBox1.Text.Trim & "%' "
@@ -31,53 +44,72 @@ Public Class usrCntlMessenger_ListNewChats
' where = " AND chat_art IN ('" & toggle_CHAT_ART & "') "
'End Select
Dim sqlQery_optimiced As String = " SELECT * FROM (SELECT TOP 200
c.chat_id,
c.chat_art,
CASE
WHEN ISNULL(c.chat_name, '') <> '' THEN c.chat_name
ELSE names.chat_name
END AS chat_name,
ISNULL(unread.ungelesen, 0) AS ungelesen,
c.chat_lastMsg
FROM tblMessenger_Chat c
-- ensure current user is member
INNER JOIN tblMessenger_ChatMembers m
ON m.chatMb_chatId = c.chat_id
AND m.chatMb_maId = " & VERAG_PROG_ALLGEMEIN.cAllgemein.USRID & "
-- 🔹 get participant names (distinct!)
OUTER APPLY (
SELECT STRING_AGG(name, ', ') AS chat_name
FROM (
SELECT DISTINCT
mit.mit_vname + ' ' + mit.mit_nname AS name
FROM tblMessenger_ChatMembers m2
INNER JOIN tblMitarbeiter mit
ON mit.mit_id = m2.chatMb_maId
WHERE m2.chatMb_chatId = c.chat_id
AND m2.chatMb_maId <> " & VERAG_PROG_ALLGEMEIN.cAllgemein.USRID & "
) x
) names
-- 🔹 unread count separated (no duplication!)
OUTER APPLY (
SELECT COUNT(*) AS ungelesen
FROM tblMessenger_ChatMessages msg
INNER JOIN tblMessenger_ChatMessageStatus s
ON s.chatMgSt_chatMsgId = msg.chatMg_id
WHERE msg.chatMg_chatId = c.chat_id
AND s.chatMgSt_MaId = " & VERAG_PROG_ALLGEMEIN.cAllgemein.USRID & "
AND s.chatMgSt_gelesen = 0
) unread WHERE c.chat_aktiv = 1
AND ISNULL(unread.ungelesen, 0) > 0
" & where & " ORDER BY c.chat_lastMsg DESC) y " & whereName
Dim topCount As String = If(GeleseneAnzeigen, "20", "200")
Dim unreadFilter As String = ""
If VERAG_PROG_ALLGEMEIN.cGlobal.CHAT_NurGelesen Then
unreadFilter = " AND ISNULL(unread.ungelesen, 0) > 0 "
End If
Dim sqlQery_optimiced As String =
"SELECT *
FROM (
SELECT TOP " & topCount & "
c.chat_id,
CASE
WHEN c.chat_art = 'CHAT' THEN ''
WHEN c.chat_art = 'LKW_CHAT' THEN 'LKW'
WHEN c.chat_art = 'SND_CHAT' THEN 'SND'
ELSE c.chat_art
END AS chat_art,
CASE
WHEN ISNULL(c.chat_name, '') <> '' THEN c.chat_name
ELSE names.chat_name
END AS chat_name,
ISNULL(unread.ungelesen, 0) AS ungelesen,
c.chat_lastMsg
FROM tblMessenger_Chat c
INNER JOIN tblMessenger_ChatMembers m
ON m.chatMb_chatId = c.chat_id
AND m.chatMb_maId = " & VERAG_PROG_ALLGEMEIN.cAllgemein.USRID & "
OUTER APPLY (
SELECT STRING_AGG(x.name, ', ') AS chat_name
FROM (
SELECT DISTINCT
mit.mit_vname + ' ' + mit.mit_nname AS name
FROM tblMessenger_ChatMembers m2
INNER JOIN tblMitarbeiter mit
ON mit.mit_id = m2.chatMb_maId
WHERE m2.chatMb_chatId = c.chat_id
AND m2.chatMb_maId <> " & VERAG_PROG_ALLGEMEIN.cAllgemein.USRID & "
) x
) names
OUTER APPLY (
SELECT COUNT(*) AS ungelesen
FROM tblMessenger_ChatMessages msg
INNER JOIN tblMessenger_ChatMessageStatus s
ON s.chatMgSt_chatMsgId = msg.chatMg_id
WHERE msg.chatMg_chatId = c.chat_id
AND s.chatMgSt_MaId = " & VERAG_PROG_ALLGEMEIN.cAllgemein.USRID & "
AND s.chatMgSt_gelesen = 0
) unread
WHERE c.chat_aktiv = 1
" & unreadFilter & "
" & where & "
ORDER BY c.chat_lastMsg DESC
) y
" & whereName & "
ORDER BY y.chat_lastMsg DESC"
.DataSource = SQL.loadDgvBySql(sqlQery_optimiced, "ADMIN")
@@ -87,6 +119,7 @@ Public Class usrCntlMessenger_ListNewChats
.Columns("chat_lastMsg").Visible = False
.Columns("chat_name").AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill
.Columns("chat_art").HeaderText = "ART"
.Columns("chat_art").Width = 50
.Columns("ungelesen").Width = 30
.Columns("ungelesen").HeaderText = "neu"
.Columns("ungelesen").DefaultCellStyle.ForeColor = Color.White
@@ -137,7 +170,35 @@ Public Class usrCntlMessenger_ListNewChats
' Next
'End If
.ClearSelection()
' Falls zuvor eine Zeile markiert war, wieder auswählen und in Sicht bringen
If prevSelectedId > -1 Then
Try
For Each rr As DataGridViewRow In .Rows
Dim vid = rr.Cells("chat_id").Value
If vid IsNot Nothing AndAlso vid IsNot DBNull.Value AndAlso IsNumeric(vid) Then
If CInt(vid) = prevSelectedId Then
.ClearSelection()
Dim colIndex As Integer = .Columns("chat_name").Index
If Not .Rows(rr.Index).Cells(colIndex).Visible Then
colIndex = .FirstDisplayedCell.ColumnIndex
End If
.CurrentCell = .Rows(rr.Index).Cells(colIndex)
.Rows(rr.Index).Selected = True
.FirstDisplayedScrollingRowIndex = Math.Max(0, rr.Index - 2)
Exit For
End If
End If
Next
Catch
' ignore
End Try
End If
End With
' If Not selFirst Then rtbChatMessage.Focus()
@@ -150,12 +211,15 @@ Public Class usrCntlMessenger_ListNewChats
Private Sub TimerNEW_MESSAGE_Tick(sender As Object, e As EventArgs) Handles TimerNEW_MESSAGE.Tick
intiDGVChats()
End Sub
Private Sub MyDatagridview1_CellContentClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvChats.CellDoubleClick '.CellContentClick
For Each openForm In Application.OpenForms()
If TypeOf (openForm) Is VERAG_PROG_ALLGEMEIN.frmMessenger Then
CType(openForm, VERAG_PROG_ALLGEMEIN.frmMessenger).WindowState = FormWindowState.Normal
'CType(openForm, VERAG_PROG_ALLGEMEIN.frmMessenger).setchatId
CType(openForm, VERAG_PROG_ALLGEMEIN.frmMessenger).BringToFront()
CType(openForm, VERAG_PROG_ALLGEMEIN.frmMessenger).intiDGVChats(dgvChats.SelectedRows(0).Cells("chat_id").Value, True, False, dgvChats.SelectedRows(0).Cells("chat_art").Value)
Exit Sub
End If
Next
@@ -163,5 +227,27 @@ Public Class usrCntlMessenger_ListNewChats
Dim f As New VERAG_PROG_ALLGEMEIN.frmMessenger()
f.Location = Cursor.Position
f.Show()
Application.DoEvents()
f.intiDGVChats(dgvChats.SelectedRows(0).Cells("chat_id").Value, True, False, dgvChats.SelectedRows(0).Cells("chat_art").Value)
End Sub
Private Sub dgvChats_CellPainting(sender As Object, e As DataGridViewCellPaintingEventArgs) Handles dgvChats.CellPainting
Try
If dgvChats.Columns.Count > 0 Then
If e.ColumnIndex = dgvChats.Columns("ungelesen").Index Then
If dgvChats.Rows(e.RowIndex).Cells("ungelesen").Value <> 0 Then ' If dgvChats.Rows(e.RowIndex).Cells("ungelesen").Value <> "" Then
dgvChats.Rows(e.RowIndex).Cells("ungelesen").Style.BackColor = Color.Red
End If
End If
End If
Catch ex As Exception
VERAG_PROG_ALLGEMEIN.cErrorHandler.ERR(ex.Message, ex.StackTrace, System.Reflection.MethodInfo.GetCurrentMethod.Name)
End Try
End Sub
End Class

View File

@@ -21,6 +21,8 @@ Public Class cRelayHub
Public Property declarationType As String
Public Property referenceNumberOverlay As String ' <--- NEU
Public Property username As String ' <--- NEU
Public Property avisoId As String ' <--- NEU
Public Property shipmentId As String ' <--- NEU
End Class
Public Class cRelayHubDv1CostAllocation

View File

@@ -1,7 +1,10 @@
Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Text
Imports System.Text.Json
Imports System.Threading.Tasks
Imports System.Windows.Forms
Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq
Public Class cOpenAI
@@ -10,6 +13,8 @@ Public Class cOpenAI
Shared apiKey As String = "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"
Shared apiUrl As String = "https://api.openai.com/v1/responses"
Shared apiKey_VERAG_Herbert As String = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImRmNjg2ZmY2LTJiMjYtNDIxYS1iMTQzLThmNzFmY2I3YjA1ZiIsImV4cCI6MTc4NTkxNzUxMCwianRpIjoiOTViM2MxZGQtMjcxMC00YWY0LTgxMGUtYzVjYWFhODdmNTM2IiwiaWF0IjoxNzgzNDk4MzEwfQ.OJ_GDpZs3Zxv7VvEpKHPjNn8jkJStkm_ruFtmqk_SiE"
Shared Sub doFirstAI()
'Dim frage As String = "Wie viele Tage braucht ein Versandschein von Istanbul nach München? Gib nur die Zahl zurück."
Dim frage As String = "Schreibe ein HAIKO über AI."
@@ -67,7 +72,7 @@ Public Class cOpenAI
' Funktion zur Kommunikation mit OpenAI API (synchrones Verhalten)
Public Shared Function AskOpenAI(question As String,
Optional maxOutputTokens As Integer = 1000) As String
Optional maxOutputTokens As Integer = 1000, Optional model As String = "gpt-4.1-mini") As String
Try
Using client As New HttpClient()
@@ -76,7 +81,7 @@ Public Class cOpenAI
New AuthenticationHeaderValue("Bearer", apiKey.Trim())
Dim requestJson As New JObject From {
{"model", "gpt-4.1-mini"},
{"model", model},
{"input", question},
{"max_output_tokens", maxOutputTokens}
}
@@ -143,6 +148,254 @@ Public Class cOpenAI
End Function
' Funktion zur Kommunikation mit OpenAI API (synchrones Verhalten)
Public Shared Function AskVERAG_HerbertAI(question As String,
Optional maxOutputTokens As Integer = 1000) As String
Using client As New HttpClient()
'client.BaseAddress = New Uri("http://192.168.0.215:11434/")
client.BaseAddress = New Uri("http://192.168.0.215:8000/v1/")
client.DefaultRequestHeaders.Authorization =
New AuthenticationHeaderValue("Bearer", apiKey_VERAG_Herbert)
'Qwen/Qwen2.5-14B-Instruct
Dim payload = New With {
.model = "Herbert",
.messages = New Object() {
New With {.role = "system", .content = "Du bist ein hilfreicher Assistent."},
New With {.role = "user", .content = question}
},
.temperature = 0.2,
.max_tokens = maxOutputTokens,
.stream = False
}
Dim json As String = JsonConvert.SerializeObject(payload)
Dim content As New StringContent(json, Encoding.UTF8, "application/json")
Dim response As HttpResponseMessage =
client.PostAsync("http://192.168.0.215:8000/v1/chat/completions", content).
GetAwaiter().
GetResult()
Dim resultJson As String =
response.Content.ReadAsStringAsync().GetAwaiter().GetResult()
If Not response.IsSuccessStatusCode Then
Throw New Exception("OpenWebUI Fehler: " & response.StatusCode.ToString() & vbCrLf & resultJson)
End If
Dim obj As JObject = JObject.Parse(resultJson)
Return obj("choices")(0)("message")("content").ToString()
End Using
End Function
Shared Function askAI_Kontakdaten_WebResearch(eingabe As String) As String
Dim prompt As String =
"Du bist ein B2B Contact Finder.
Such im Web nach den Kontaktdaten, vorwiegend Telefon + Mail
Accurancy ist die Wahrscheinlcihkeit, dass es sich um das gescuht UNternehmen handelt;
Ausgabeformat:
Treffer 1
Quelle:
Unternehmen:
Website:
Telefon:
E-Mail:
Adresse:
Accurancy:
Falls mehrere plausible Unternehmen gefunden werden, gib maximal 3 Treffer aus.
Jeder Treffer muss vollständig von einer Quelle sein sein.
Kein eindeutiger Treffer möglich.
Grund: ...
EINGABE: [[" & eingabe & "]]
"
Console.WriteLine(prompt)
Return AskOpenAI(prompt, 10000, "gpt-5.5")
End Function
Shared Function askAI_HERBERT_Allg(prompt As String) As String
Console.WriteLine(prompt)
Dim antwort As String = AskVERAG_HerbertAI(prompt, 2500)
Console.WriteLine(antwort)
Return antwort
End Function
Shared Function askAI_HERBERT_Kontakdaten_WebResearch(eingabe As String) As String
Dim prompt As String =
"Du bist ein B2B Contact Finder.
HARTE REGEL:
Jeder Treffer darf ausschließlich Daten aus einer einzigen Quelle enthalten.
Standardquelle ist die offizielle Unternehmenswebsite.
Das Mischen von Website, Telefonnummer, E-Mail-Adresse oder Adresse aus unterschiedlichen Quellen ist verboten.
Ziel:
Finde möglichst schnell die Telefonnummer und E-Mail-Adresse eines Unternehmens.
Eingabe:
Die Eingabe ist unstrukturiert und kann Firmenname, Ort, PLZ, Land, Website, Telefonnummer, E-Mail oder Freitext enthalten.
Arbeitsweise:
Identifiziere das wahrscheinlich richtige Unternehmen.
Ermittle die offizielle Website.
Verwende danach ausschließlich diese Website als Quelle.
Suche dort zuerst auf der Kontaktseite, danach im Impressum.
Telefon, E-Mail und Adresse dürfen nur ausgegeben werden, wenn sie auf derselben offiziellen Website gefunden wurden.
Sobald Telefonnummer oder E-Mail gefunden wurden, beende die Recherche.
Nur wenn keine offizielle Website eindeutig gefunden wird, verwende Google Maps als einzige alternative Quelle.
Wenn Google Maps verwendet wird, dürfen alle ausgegebenen Daten nur aus Google Maps stammen.
Nutze keine weiteren Quellen.
Recherchiere keine Ansprechpartner.
Regeln:
Ein Treffer = eine Quelle.
Keine Daten aus mehreren Quellen kombinieren.
Verwende nur Informationen, die eindeutig demselben Unternehmen zugeordnet sind.
Erfinde keine Daten.
Rate keine Telefonnummern, E-Mail-Adressen, Domains oder Adressen.
Korrigiere keine Domains durch Vermutung.
Bei Unsicherheit Information weglassen.
Wenn nur Telefon gefunden wird, gib nur Telefon aus.
Wenn nur E-Mail gefunden wird, gib nur E-Mail aus.
Keine Platzhalter wie N/A, unbekannt oder nicht gefunden.
Keine Faxnummern, Handelsregisterdaten, Rechtsform, Branche, Umsatz oder UID.
Ausgabe kurz und ohne Fließtext.
Ausgabeformat:
Treffer 1
Quelle:
Unternehmen:
Website:
Telefon:
E-Mail:
Adresse:
Falls mehrere plausible Unternehmen gefunden werden, gib maximal 3 Treffer aus.
Jeder Treffer muss vollständig quellenrein sein.
Falls kein eindeutiger Treffer möglich ist:
Kein eindeutiger Treffer möglich.
Grund: ...
EINGABE: [[" & eingabe & "]]
"
Console.WriteLine(prompt)
Dim antwort As String = AskVERAG_HerbertAI(prompt, 2500)
Console.WriteLine(antwort)
Return antwort
End Function
Shared Function askAI_Kontakdaten_WebResearcADVh(eingabe As String) As String
Dim prompt As String =
"Du bist ein B2B Contact Finder.
HARTE REGEL:
Jeder Treffer darf ausschließlich Daten aus einer einzigen Quelle enthalten.
Standardquelle ist die offizielle Unternehmenswebsite.
Das Mischen von Website, Telefonnummer, E-Mail-Adresse oder Adresse aus unterschiedlichen Quellen ist verboten.
Ziel:
Finde möglichst schnell die Telefonnummer und E-Mail-Adresse eines Unternehmens.
Eingabe:
Die Eingabe ist unstrukturiert und kann Firmenname, Ort, PLZ, Land, Website, Telefonnummer, E-Mail oder Freitext enthalten.
Arbeitsweise:
Identifiziere das wahrscheinlich richtige Unternehmen.
Ermittle die offizielle Website.
Verwende danach ausschließlich diese Website als Quelle.
Suche dort zuerst auf der Kontaktseite, danach im Impressum.
Telefon, E-Mail und Adresse dürfen nur ausgegeben werden, wenn sie auf derselben offiziellen Website gefunden wurden.
Sobald Telefonnummer oder E-Mail gefunden wurden, beende die Recherche.
Nur wenn keine offizielle Website eindeutig gefunden wird, verwende Google Maps als einzige alternative Quelle.
Wenn Google Maps verwendet wird, dürfen alle ausgegebenen Daten nur aus Google Maps stammen.
Nutze keine weiteren Quellen.
Recherchiere keine Ansprechpartner.
Regeln:
Ein Treffer = eine Quelle.
Keine Daten aus mehreren Quellen kombinieren.
Verwende nur Informationen, die eindeutig demselben Unternehmen zugeordnet sind.
Erfinde keine Daten.
Rate keine Telefonnummern, E-Mail-Adressen, Domains oder Adressen.
Korrigiere keine Domains durch Vermutung.
Bei Unsicherheit Information weglassen.
Wenn nur Telefon gefunden wird, gib nur Telefon aus.
Wenn nur E-Mail gefunden wird, gib nur E-Mail aus.
Keine Platzhalter wie N/A, unbekannt oder nicht gefunden.
Keine Faxnummern, Handelsregisterdaten, Rechtsform, Branche, Umsatz oder UID.
Ausgabe kurz und ohne Fließtext.
Ausgabeformat:
Treffer 1
Quelle:
Unternehmen:
Website:
Telefon:
E-Mail:
Adresse:
Falls mehrere plausible Unternehmen gefunden werden, gib maximal 3 Treffer aus.
Jeder Treffer muss vollständig quellenrein sein.
Falls kein eindeutiger Treffer möglich ist:
Kein eindeutiger Treffer möglich.
Grund: ...
EINGABE: [[" & eingabe & "]]
"
Console.WriteLine(prompt)
Return AskOpenAI(prompt, 10000, "gpt-5.5")
End Function
Shared Function askAI_Zolltarif(
unternehmensbeschreibung As String,
artikel As List(Of ZollArtikelInput)

View File

@@ -370,9 +370,9 @@ Public Class cProgramFunctions
Try
Dim sql As String =
"SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '" & tableName & "'
AND DATA_TYPE IN ('varchar','nvarchar','char','nchar','decimal','numeric','float','real')"
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = '" & tableName & "'
AND DATA_TYPE IN ('varchar','nvarchar','char','nchar','decimal','numeric','float','real')"
Dim dt As DataTable =
(New SQL).loadDgvBySql(sql, conn_art)
@@ -404,6 +404,26 @@ Public Class cProgramFunctions
Dim valueObj As Object = p.Value()
Dim valueStr As String = valueObj.ToString
' -------------------------
' BIT / BOOLEAN
' -------------------------
If dataType = "bit" Then
Select Case valueStr.Trim.ToLower
Case "true"
' gültig
Case "false"
' gültig
Case "1", "0"
' bereits gültig
Case Else
errors.Add(fieldName & " -> Ungültiger Bit-Wert: " & valueStr)
End Select
Continue For
End If
' -------------------------
' 1) TEXTFELDER
' -------------------------
@@ -413,6 +433,14 @@ Public Class cProgramFunctions
If maxLen = -1 Then Continue For ' varchar(max)
If maxLen = 1 Then
If valueStr.Equals("true", StringComparison.OrdinalIgnoreCase) Then
valueStr = "1"
ElseIf valueStr.Equals("false", StringComparison.OrdinalIgnoreCase) Then
valueStr = "0"
End If
End If
If valueStr.Length > maxLen Then
errors.Add(fieldName & " -> " & valueStr.Length & "/" & maxLen)
End If