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

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