SQL Navision Tabellennamen rausbekommen

24. September 2012 16:13

Hallo ich hab eine simple Frage,
gibt es ein SQL Statement mit dem ich sämmtliche TabellenNamen rausholen kann?

mit SELECT * FROM INFORMATION_SCHEMA.TABLES; funktioniert es leider nicht. Vllt muss ich hier ein USE 'Databasename'; davor setzen aber ich weiß grad gar nicht wie die genau heißt :(

Also alle wie jetzt zB:
Item
Item_Ledger_Entry
Job..
Warehouse...
einfach alle Namen

Im Endeffekt muss ich einfach einen Datensatz finden und der müsste wohl in der Tabelle 'Job_Budget_Line' drin sein wobei ich dort mit all meinen Rechten nicht draufkomme. Aber diese muss ja auch iwie anderst 'zusammenbaubar' sein durch andere Tables.

Hoffe jemand kann mir helfen.
Peace Adi

Re: SQL Navision Tabellennamen rausbekommen

24. September 2012 17:47

Du möchtest alle Tabellen aufgelistet haben von einer DB derren Name du nicht kennst?

Alle Datenbanken kannst du dir mit
Code:
exec sp_databases

ausgeben lassen.

Die Abfrage für die Tabellen kannst du dann wie bereits aufgeführt abfragen. Jedoch bin ich nicht der Fan von Wildcardabfrag (*) , es langt ja auch nur die Abfrage auf die Spalte "Table_Name"

Code:
USE Databasename
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES


Info:
Mandantenspezifische Tabellen beinhalten zusätzlich noch den Mandanten im Tabellenname. Mandant$Tabellenname

Re: SQL Navision Tabellennamen rausbekommen

25. September 2012 08:18

Wie wäre es noch mit
Code:
SELECT [name] FROM sys.objects
WHERE [type] = 'U'

?

Und ja ein USE davor wäre nicht schlecht. Kannst ja alle Datenbanken durchlaufen.

Re: SQL Navision Tabellennamen rausbekommen

25. September 2012 08:32

Hi,

ich bring mal ein bisschen Code (VB.NET):
Code:
   Function GetNAVTableObjects() As DataTable

        Dim myConnection As New SqlConnection
        If My.Application.SQLAuth = "Database" Then
            myConnection.ConnectionString = "server=" & My.Application.SQLServer & ";Trusted_Connection=False;database=" & My.Application.SQLDatabase & "User ID=" & My.Application.SQLUser & ";Password=" & My.Application.SQLUserPassword & ";"
        Else '"Windows"
            myConnection.ConnectionString = "server=" & My.Application.SQLServer & ";Trusted_Connection=true;database=" & My.Application.SQLDatabase & ";"
        End If

        Dim myCommand As New SqlCommand
        myCommand.CommandText = "SELECT [timestamp],[Type],[Company Name] as CompanyName,[ID],[Name],[Modified],[Compiled],[BLOB Reference] as BLOBReference,[BLOB Size] as BLOBSize,[DBM Table No_] as DBMTableNo,[Date],[Time],[Version List] as VersionList,[Locked],[Locked By] as LockedBy FROM [Object] where [Type]=0"
        myCommand.Connection = myConnection

        Dim da As New SqlDataAdapter
        da.SelectCommand = myCommand

        Dim ds As New DataSet
        myConnection.Open()
        da.Fill(ds, "object")

        myConnection.Close()
        Return ds.Tables("object")

    End Function

    Function GetNAVTableName(NAVTableID As String) As String

        Dim tablename As String = ""
        Dim foundrows() As DataRow
        foundrows = GetNAVTableObjects.Select("ID=" & NAVTableID)
        If foundrows.Count = 0 Then
            MsgBox("Tabelle " & NAVTableID & " nicht vorhanden")
            Exit Function
        End If
        For Each row As DataRow In foundrows
            If row("CompanyName").ToString.Length > 0 Then
                If My.Application.NAVCompany = row("CompanyName") Then
                    'Tabelle: Datapercompany=yes => tabellenname=Mandant$tabname
                    tablename = row("CompanyName") & "$" & row("Name")
                    Exit For
                End If
            Else
                tablename = row("Name")
                Exit For
            End If
        Next

        Return tablename

    End Function


und dann z. B.
Code:
                Dim myConnection As New SqlConnection
                If My.Application.SQLAuth = "Database" Then
                    myConnection.ConnectionString = "server=" & My.Application.SQLServer & ";Trusted_Connection=False;database=" & My.Application.SQLDatabase & "User ID=" & My.Application.SQLUser & ";Password=" & My.Application.SQLUserPassword & ";"
                Else '"Windows"
                    myConnection.ConnectionString = "server=" & My.Application.SQLServer & ";Trusted_Connection=true;database=" & My.Application.SQLDatabase & ";"
                End If

                Dim myCommand As New SqlCommand
                Dim itemtablename, bomtablename, ledgertablename As String
                itemtablename = GetNAVTableName("27")
                bomtablename = GetNAVTableName("90")
                ledgertablename = GetNAVTableName("32") & "$VSIFT$3"

                myCommand.CommandText = "SELECT TOP (100) PERCENT a.No_ AS No, a.Description, a.[Search Description] AS Matchcode, " & _
                "a.[Item Category Code] AS ItemCategory, a.[Product Group Code] AS ProductGroup, " & _
                "a.[Base Unit of Measure] AS BaseUnitOfMeasure, CASE WHEN b.[No_] IS NULL THEN 0 ELSE 1 END AS BillOfMaterials, SUM(c.SUM$Quantity) AS Inventory, a.Blocked, " & _
                "a.[Unit Cost] AS UnitCost, a.[Unit Price] AS UnitPrice, a.[Gen_ Prod_ Posting Group] AS ProductPostingGroup, a.[VAT Prod_ Posting Group] AS VATPostingGroup, " & _
                "a.[Price Includes VAT] AS PriceIncludingTax, a.[Costing Method] AS CostingMethod, a.[Inventory Posting Group] AS InventoryPostingGroup, a.[Last Direct Cost] AS LastDirectCost, " & _
                "a.[Vendor No_] AS VendorNo, a.[Vendor Item No_] AS VendorItemNo, a.[Purch_ Unit of Measure] AS PurchaseUnitOfMeasure, a.[Lead Time Calculation] AS LeadTime, " & _
                "a.[Tariff No_] AS TariffNo, a.[Country_Region of Origin Code] AS CountryOfOrigin, a.[Net Weight] AS NetWeight, a.[Gross Weight] AS GrossWeight " & _
                "FROM [" & itemtablename & "] as a LEFT OUTER JOIN [" & bomtablename & "] as b ON a.No_ = b.[Parent Item No_] LEFT OUTER JOIN [" & ledgertablename & "] as c ON a.No_ = c.[Item No_] " & _
                "GROUP BY a.No_, a.Description, a.[Search Description], a.[Item Category Code], a.[Product Group Code], a.[Base Unit of Measure], a.Blocked, a.[Unit Cost], " & _
                      "a.[Unit Price], a.[Gen_ Prod_ Posting Group], a.[VAT Prod_ Posting Group], a.[Price Includes VAT], a.[Costing Method], a.[Inventory Posting Group], " & _
                      "a.[Last Direct Cost], a.[Vendor No_], a.[Vendor Item No_], a.[Purch_ Unit of Measure], a.[Lead Time Calculation], a.[Tariff No_], " & _
                      "a.[Country_Region of Origin Code], a.[Net Weight], a.[Gross Weight], CASE WHEN b.[No_] IS NULL THEN 0 ELSE 1 END " & _
                      "HAVING (a.Blocked = 0) ORDER BY No"
                myCommand.Connection = myConnection

                Dim da As New SqlDataAdapter
                da.SelectCommand = myCommand

                Dim ds As New DataSet
                myConnection.Open()
                da.Fill(ds, "products")

                myConnection.Close()
                Return ds.Tables("products")


Volker

Re: SQL Navision Tabellennamen rausbekommen

25. September 2012 10:07

Hallo Modde :)

danke mal für deine Antwort. Leider muss ich sagen funktioniert es bei mir nicht :(
Das SQL-Statement das ich abfeuer hab ich einfach direkt aus deinem Beitrag kopiert und abgefeuert. Jedoch nichts...

Oder stellen wir das Thema mal anders, hast du eine Idee über welche Tabelle ich an Projektnummer, Artikelnummer, Quantity(Menge), Teilaktivität, Budget(Kosten oder so) komme? Weil alle stehen schön in dieser 'Job_Budget_Line' wo ich nicht rankomme...

Re: SQL Navision Tabellennamen rausbekommen

25. September 2012 11:43

Würdest Du bitte mal sagen wo Du die SQL-Abfrgae ausführst? Und was Du mit den gefunden Daten weiter veranstalten willst? Hast Du entsprechende Rechte im SQL-Server? Findest Du die Tabelle im Management-Studio?

Wenn Du meinen Code oben gelesen hast, dann siehst Du, dass ich die Tabelle Objects mit der NAV-Tabellennummer abfrage. Mit meinem Code ist auch sichergestellt, dass Mandantenübergreifende Tabellen auch gefunden werden.

Volker