Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Импорт данных из Эксель в две связанные таблицы / 15 сообщений из 15, страница 1 из 1
14.03.2020, 17:44
    #39937428
WalkManX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из Эксель в две связанные таблицы
Добрый день уважаемые форумчане, прошу помощи. Пытаюсь сделать автоматический импорт данных из эксель в аксес.
Импортирую данный в таблицу аксес функцией
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Sub btn_Import_from_Excel_Click()
'Окно диалога для выбора файла экселя
Dim FName As String
Dim result As Integer
With Application.FileDialog(1)
   .Title = "Выберите файл"
   .InitialFileName = CurrentProject.Path 'путь по умолчанию - путь к текущей бд
   .AllowMultiSelect = False
   .Filters.Clear
   .Filters.Add "MS Excel", "*.xls,*.xlsx", 1
result = .Show
If result = 0 Then Exit Sub
FName = Trim(.SelectedItems.Item(1))
End With


'Импорт выбранного файла в таблицу с заданным именем
DoCmd.TransferSpreadsheet acImport, , "ImportExcelData_Temp", FName, True

End Sub



Получаю таблицу "ImportExcelData_Temp"
SAMOSTCODE MOANDATE PAR0101 PAR0102S-QLT-001 19.03.2020772 123S-QLT-002 22.03.2020 0.54S-QLT-003 16.03.2020 465S-QLT-004 08.01.202045S-QLT-005 15.05.202034 897S-QLT-006 14.11.2019 S-QLT-006 16.05.202014 13

далее мне нужно эти данные распределить по таблицам: Таблица1 и Таблица2 как показано в примере ниже

Таблица1
Code sample SAMOSTCODE MOANDATE35 S-QLT-001 19.03.202036 S-QLT-002 22.03.202037 S-QLT-003 16.03.202038 S-QLT-004 08.01.202039 S-QLT-005 15.05.202040 S-QLT-006 14.11.201941 S-QLT-006 16.05.2020

Таблица2
Code sample MOANVALUE MOANDATE PARCODE 35 772 19.03.2020 PAR0101 35 123 19.03.2020 PAR0102 36 22.03.2020 PAR0101 36 0.54 22.03.2020 PAR0102 37 16.03.2020 PAR0101 37 465 16.03.2020 PAR0102

Поле код "Code sample" добавляется вручную(типа поле счетчик) при вводе данных через форму в БД, это не было проблемой раньше когда данных было не много и можно было их вручную быстро ввести, теперь данных стало больше, поэтому удобнее будет сделать это автоматически.
...
Рейтинг: 0 / 0
16.03.2020, 17:41
    #39937930
Импорт данных из Эксель в две связанные таблицы
На листе значения в SAMOSTCODE уникальны?

Что уникально в Таблица1? SAMOSTCODE, или SAMOSTCODE в паре с MOANDATE, или ничего?
Эта уникальность подкреплена индексом?

А в Таблица1 записи всегда добавляются или такие же могут уже существовать?

Колонки PAR0101 и PAR0102 - так всегда, или может быть разное количество и с другими именами?
...
Рейтинг: 0 / 0
20.03.2020, 11:16
    #39939443
WalkManX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из Эксель в две связанные таблицы
Кривцов Анатолий,
Прикрепил кусок БД, надеюсь так будет проще понять суть моей проблемы.
авторНа листе значения в SAMOSTCODE уникальны?
Они уникальны вместе с MOANDATE также как и в Таблице1 (в БД это T_MOSAMPLE), Таблица2 (в БД это T_MOANAL)
авторА в Таблица1 записи всегда добавляются или такие же могут уже существовать?
Записи всегда добавляются,

авторКолонки PAR0101 и PAR0102 - так всегда, или может быть разное количество и с другими именами?
Да, разное количество и с другими именами.
...
Рейтинг: 0 / 0
20.03.2020, 11:18
    #39939445
WalkManX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из Эксель в две связанные таблицы
...
Рейтинг: 0 / 0
20.03.2020, 12:15
    #39939478
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из Эксель в две связанные таблицы
Если предположить, что Code sample - это автоинкремент в Таблица1, то сначала
Код: sql
1.
2.
3.
INSERT INTO Таблица1 (SAMOSTCODE, MOANDATE)
SELECT SAMOSTCODE, MOANDATE
FROM ImportExcelData_Temp;


а потом для каждого поля со значениями (или длинный UNION в SELECT-части)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
INSERT INTO Таблица2 ([Code sample], MOANVALUE, MOANDATE, PARCODE)
SELECT Таблица1.[Code sample], 
       ImportExcelData_Temp.PAR0101, 
       ImportExcelData_Temp.MOANDATE, 
       'PAR0101'
FROM ImportExcelData_Temp
JOIN Таблица1 ON ImportExcelData_Temp.SAMOSTCODE = Таблица1.SAMOSTCODE 
            AND ImportExcelData_Temp.MOANDATE = Таблица1.MOANDATE
/* WHERE ImportExcelData_Temp.PAR0101 IS NOT NULL */ ;
...
Рейтинг: 0 / 0
20.03.2020, 18:30
    #39939663
Импорт данных из Эксель в две связанные таблицы
Я бы делал так (без временной таблицы), объявление переменных опускаю:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
  Set db = CurrentDB
  strSQL = "SELECT * FROM [Excel 12.0 Xml;Hdr=True;Database=" & FName & "].[A1:AZ65000]"
'Вернет данные используемого диапазона с 1-го листа (в вашем примере - A1:D8)
  Set rsXl = db.OpenRecordset(strSQL)
  
  strSQL = "SELECT * FROM T_MOSAMPLE WHERE False" 'Пустой Recordset
  Set rsT1 = db.OpenRecordset(strSQL)
'Правильнее в WHERE вместо False подставить значения полей из 1-й записи rsXl и проверить
'наличие записи (т.е. импорт уже выполнялся)

  strSQL = "SELECT * FROM T_MOANAL WHERE False"
  Set rsT2 = db.OpenRecordset(strSQL)

Do Until rsXl.EOF      
  With rsT1
      .AddNew
      !SAMOSTCODE = rsXl!SAMOSTCODE 
      !MOANDATE = rsXl!MOANDATE
      .Update
      .Bookmark = .LastModified 'Переход на добавленную запись
  End With 

  For i = 2 To rsXl.Fields.Count - 1
      Set fld = rsXl.Fields(i)
    If Not IsNull(fld.Value) Then
      rsT2.AddNew
      rsT2![Code sample] = rsT1![Code sample] 'В T2 поле "Code sample" должно быть типа "Длинное целое"
      rsT2![MOANDATE] = rsT1![MOANDATE] 'А нужно ли это поле, если оно есть в Т1?
      rsT2![MOANVALUE] = fld.Value
      rsT2![PARCODE] = fld.Name
    End If
  Next

  rsXl.MoveNext
Loop

Если этот код выполнять в транзакции, то будут и надежнее, и быстрее.
...
Рейтинг: 0 / 0
21.03.2020, 23:38
    #39939987
WalkManX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из Эксель в две связанные таблицы
Кривцов Анатолий,
Спасибо за отклик.
Немного подправил под себя,
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
Dim dB As Dao.Database, rsXl As Dao.Recordset, rsT1 As Dao.Recordset, rsT2 As Dao.Recordset
Dim FName As String
Dim result As Integer
Dim strSQL As String
With Application.FileDialog(1)
   .Title =  "Âûáåðèòå ôàéë"
   .InitialFileName = CurrentProject.Path 'ïóòü ïî óìîë÷àíèþ - ïóòü ê òåêóùåé áä
   .AllowMultiSelect = False
   .Filters.Clear
   .Filters.Add "MS Excel", "*.xls,*.xlsx", 1
result = .Show
If result = 0 Then Exit Sub
FName = Trim(.SelectedItems.Item(1))
End With
'Èìïîðò âûáðàííîãî ôàéëà â òàáëèöó ñ çàäàííûì èìåíåì
'DoCmd.TransferSpreadsheet acImport, , "ImportExcelData_Temp", FName, True

  Set dB = CurrentDb
  strSQL = "SELECT * FROM [Excel 12.0 Xml;Hdr=True;Database=" & FName & "].[A1:AZ65000]"
'Âåðíåò äàííûå èñïîëüçóåìîãî äèàïàçîíà ñ 1-ãî ëèñòà (â âàøåì ïðèìåðå - A1:D8)
  Set rsXl = dB.OpenRecordset(strSQL)
  
  strSQL = "SELECT * FROM T_MOSAMPLE WHERE False" 'Ïóñòîé Recordset
  Set rsT1 = dB.OpenRecordset(strSQL)
'Ïðàâèëüíåå â WHERE âìåñòî False ïîäñòàâèòü çíà÷åíèÿ ïîëåé èç 1-é çàïèñè rsXl è ïðîâåðèòü
'íàëè÷èå çàïèñè (ò.å. èìïîðò óæå âûïîëíÿëñÿ)

  strSQL = "SELECT * FROM T_MOANAL WHERE False"
  Set rsT2 = dB.OpenRecordset(strSQL)

Do Until rsXl.EOF
  With rsT1
      .AddNew
      !SAMOSTCODE = rsXl!SAMOSTCODE
      !MOSADATE = rsXl!MOANDATE
      !MOSACODE = rsXl!MOSACODE
      .Update
      .Bookmark = .LastModified 'Ïåðåõîä íà äîáàâëåííóþ çàïèñü
  End With

  For i = 2 To rsXl.Fields.Count - 1
      Set fld = rsXl.Fields(i)
    If Not IsNull(fld.Value) Then
      rsT2.AddNew
      rsT2![ANMOSACODE] = rsT1![MOSACODE] 'Â T2 ïîëå "Code sample" äîëæíî áûòü òèïà "Äëèííîå öåëîå"
      rsT2![MOANDATE] = rsT1![MOSADATE] 'À íóæíî ëè ýòî ïîëå, åñëè îíî åñòü â Ò1?
      rsT2![MOANVALUE] = fld.Value
      rsT2![ANMOPACODE] = fld.Name
    End If
  Next

  rsXl.MoveNext
Loop
End Sub



работает на половину т.е. в Таблицу1(она же T_MOSAMPLE) добавляет все отлично, а вот в Таблицу2 ( она же T_MOANAL) безрезультатно

авторВ T2 поле "Code sample" должно быть типа "Длинное целое"
В бд это поле имеет текстовое значение, хотя изменение в числовое ничего не дало
...
Рейтинг: 0 / 0
22.03.2020, 12:51
    #39940037
WalkManX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из Эксель в две связанные таблицы
Без крякозябров)
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
Dim dB As Dao.Database, rsXl As Dao.Recordset, rsT1 As Dao.Recordset, rsT2 As Dao.Recordset
Dim FName As String
Dim result As Integer
Dim strSQL As String
With Application.FileDialog(1)
   .Title = "Выберите файл"
   .InitialFileName = CurrentProject.Path 'путь по умолчанию - путь к текущей бд
   .AllowMultiSelect = False
   .Filters.Clear
   .Filters.Add "MS Excel", "*.xls,*.xlsx", 1
result = .Show
If result = 0 Then Exit Sub
FName = Trim(.SelectedItems.Item(1))
End With
'Импорт выбранного файла в таблицу с заданным именем
'DoCmd.TransferSpreadsheet acImport, , "ImportExcelData_Temp", FName, True

  Set dB = CurrentDb
  strSQL = "SELECT * FROM [Excel 12.0 Xml;Hdr=True;Database=" & FName & "].[A1:AZ65000]"
'Вернет данные используемого диапазона с 1-го листа (в вашем примере - A1:D8)
  Set rsXl = dB.OpenRecordset(strSQL)
  
  strSQL = "SELECT * FROM T_MOSAMPLE WHERE False" 'Пустой Recordset
  Set rsT1 = dB.OpenRecordset(strSQL)
'Правильнее в WHERE вместо False подставить значения полей из 1-й записи rsXl и проверить
'наличие записи (т.е. импорт уже выполнялся)

  strSQL = "SELECT * FROM T_MOANAL WHERE False"
  Set rsT2 = dB.OpenRecordset(strSQL)

Do Until rsXl.EOF
  With rsT1
      .AddNew
      !SAMOSTCODE = rsXl!SAMOSTCODE
      !MOSADATE = rsXl!MOANDATE
      !MOSACODE = rsXl!MOSACODE
      .Update
      .Bookmark = .LastModified'Переход на добавленную запись
  End With

  For i = 2 To rsXl.Fields.Count - 1
      Set fld = rsXl.Fields(i)
    If Not IsNull(fld.Value) Then
      rsT2.AddNew
      rsT2![ANMOSACODE] = rsT1![MOSACODE]'В T2 поле "Code sample" должно быть типа "Длинное целое"
      rsT2![MOANDATE] = rsT1![MOSADATE]'А нужно ли это поле, если оно есть в Т1?
      rsT2![MOANVALUE] = fld.Value
      rsT2![ANMOPACODE] = fld.Name
    End If
  Next

  rsXl.MoveNext
Loop
End Sub
...
Рейтинг: 0 / 0
22.03.2020, 14:55
    #39940058
Импорт данных из Эксель в две связанные таблицы
WalkManX

а вот в Таблицу2 ( она же T_MOANAL) безрезультатно

авторВ T2 поле "Code sample" должно быть типа "Длинное целое"

В бд это поле имеет текстовое значение, хотя изменение в числовое ничего не дало
Код: vbnet
1.
2.
3.
4.
 ...
     rsT2![ANMOPACODE] = fld.Name
      rsT2.Update
    End If

Добавьте выделенное (на коленке писал, забыл)
А поле в Т2 должно быть не только числовым, а в схеме данных должна быть создана связь с сохранением целостности данных.
Еще раз - рекомендую использовать транзакцию, тогда импорт будет выполнен иолностью, или, при ошибке, отменен.
...
Рейтинг: 0 / 0
23.03.2020, 13:43
    #39940253
WalkManX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из Эксель в две связанные таблицы
Кривцов Анатолий
WalkManX

а вот в Таблицу2 ( она же T_MOANAL) безрезультатно

пропущено...

В бд это поле имеет текстовое значение, хотя изменение в числовое ничего не дало

Код: vbnet
1.
2.
3.
4.
 ...
     rsT2![ANMOPACODE] = fld.Name
      rsT2.Update
    End If

Добавьте выделенное (на коленке писал, забыл)
А поле в Т2 должно быть не только числовым, а в схеме данных должна быть создана связь с сохранением целостности данных.
Еще раз - рекомендую использовать транзакцию, тогда импорт будет выполнен иолностью, или, при ошибке, отменен.



Спасибо вам огромное, вы мне очень помогли, как вы и рекомендовали, погуглив что такое транзакция, сделал через транзакцию добавление данных и добавил некоторые изменения, теперь "Code sample" добавляется автоматически и не надо его в экселе редактировать в ручную.

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
Private Sub Кнопка1_Click()
  On Error GoTo ErrorHandler
Dim dB As DAO.Database, rsXl As DAO.Recordset, rsT1 As DAO.Recordset, rsT2 As DAO.Recordset
Dim wrkCurrent As DAO.Workspace
Dim FName As String
Dim result As Integer
Dim strSQL As String

With Application.FileDialog(1)
   .Title = "Выберите файл"
   .InitialFileName = CurrentProject.Path 'путь по умолчанию - путь к текущей бд
   .AllowMultiSelect = False
   .Filters.Clear
   .Filters.Add "MS Excel", "*.xls,*.xlsx", 1
result = .Show
If result = 0 Then Exit Sub
FName = Trim(.SelectedItems.Item(1))
End With
'Импорт выбранного файла в таблицу с заданным именем
'DoCmd.TransferSpreadsheet acImport, , "ImportExcelData_Temp", FName, True

Set wrkCurrent = DBEngine.Workspaces(0)
  Set dB = CurrentDb
  strSQLXL = "SELECT * FROM [Excel 12.0 Xml;Hdr=True;Database=" & FName & "].[A1:AZ65000]"
'Вернет данные используемого диапазона с 1-го листа (в вашем примере - A1:D8)
  Set rsXl = dB.OpenRecordset(strSQLXL)
    strSQLT1 = "SELECT * FROM T_MOSAMPLE WHERE False" 'Пустой Recordset
  Set rsT1 = dB.OpenRecordset(strSQLT1)
'Правильнее в WHERE вместо False подставить значения полей из 1-й записи rsXl и проверить
'наличие записи (т.е. импорт уже выполнялся)

  strSQLT2 = "SELECT * FROM T_MOANAL WHERE False"
  Set rsT2 = dB.OpenRecordset(strSQLT2)

wrkCurrent.BeginTrans
Do Until rsXl.EOF
  With rsT1
      .AddNew
      !SAMOSTCODE = rsXl!SAMOSTCODE
      !MOSADATE = rsXl!MOANDATE
      !MOSACODE = CurrentDb.OpenRecordset("select top 1 MOSACODE from T_MOSAMPLE order by MOSACODE desc").Fields(0) + 1
      .Update
      .Bookmark = .LastModified 'Переход на добавленную запись
  End With

  For i = 2 To rsXl.Fields.Count - 1
      Set fld = rsXl.Fields(i)
    If Not IsNull(fld.Value) Then
      rsT2.AddNew
      rsT2![ANMOSACODE] = rsT1![MOSACODE] 'В T2 поле "Code sample" должно быть типа "Длинное целое"
      rsT2![MOANDATE] = rsT1![MOSADATE] 'А нужно ли это поле, если оно есть в Т1?
      rsT2![MOANVALUE] = fld.Value
      rsT2![ANMOPACODE] = fld.Name
      rsT2.Update
    End If

  Next

  rsXl.MoveNext
Loop
   If MsgBox("Save all changes?", vbQuestion + vbYesNo) = vbYes Then
      wrkCurrent.CommitTrans
   Else
      wrkCurrent.Rollback
   End If
ErrorHandler:
  MsgBox "Eroare # " & str(Err.Number) _
            & Err.Source & Chr(13) & Err.Description


End Sub




Теперь у меня появилась новая задача, написал функцию

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Function Param_LOD(strPARAM As String, dblPARAM As Variant) As Variant
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim rs2 As DAO.Recordset
Set db = CurrentDb
Set rs1 = db.OpenRecordset("select * from T_MOParam where MOPACODE='" & strPARAM & "'")
Set rs2 = db.OpenRecordset("select * from T_MOANAL where ANMOPACODE='" & strPARAM & "'")
    
If IsNull(dblPARAM) Or dblPARAM = 0 Then
     Param_LOD = Null
   Exit Function
End If

With rs1
If IsNull(.Fields("zLimit")) Then
   Param_LOD = Null
  Exit Function
     ElseIf rs1! & strPARAM & .Value = rs2! & strPARAM & .Value Then Param_LOD = "LOD"
  
 End If
End With
rs1.Close
rs2.Close
Set rs1 = Nothing
Set rs2 = Nothing
End Function



она должна сравнивать записи двух таблиц и если записи совпадают, присвоить функции значение "LOD", но VBA ругается на "ElseIf rs1!" , мой уровень аксеса не позволяет самому разобраться, не судите строго)
...
Рейтинг: 0 / 0
23.03.2020, 16:54
    #39940310
Импорт данных из Эксель в две связанные таблицы
WalkManX

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
...
  rsXl.MoveNext
Loop
   If MsgBox("Save all changes?", vbQuestion + vbYesNo) = vbYes Then
      wrkCurrent.CommitTrans
   Else
      wrkCurrent.Rollback
   End If

   Exit Sub

ErrorHandler:
   wrkCurrent.Rollback
  MsgBox "Eroare # " & str(Err.Number) _
            & Err.Source & Chr(13) & Err.Description
End Sub


В вашем варианте даже при отсутствии ошибок вы попадете на ErrorHandler: и получите ложное сообщение "Eroare # "...
А при появлении ошибки изменения не будут отменены.
Добавьте отмеченные строки.

WalkManX
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
With rs1
If IsNull(.Fields("zLimit")) Then
   Param_LOD = Null
  Exit Function
     ElseIf rs1! & strPARAM & .Value = rs2! & strPARAM & .Value Then Param_LOD = "LOD"
  
 End If
End With

Какой смысл вы заложили в эту конструкцию? Что у вас в strPARAM?
Если там имя поля, то конструкция должна быть такой:
Код: vbnet
1.
2.
  ElseIf rs1.Fields(strPARAM).Value = rs2.Fields(strPARAM).Value Then 
    Param_LOD = "LOD"

Но судя по тому, что strPARAM участвует в WHERE запросов, то там значение.
Ждем объяснений...
...
Рейтинг: 0 / 0
23.03.2020, 17:22
    #39940317
WalkManX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из Эксель в две связанные таблицы
Кривцов Анатолий,
авторДобавьте отмеченные строки.Еще раз спасибо, исправил.

авторНо судя по тому, что strPARAM участвует в WHERE запросов, то там значение.
Да, все верно это значение.

PARCode valuePAR0101 2PAR0101 7PAR0102 5PAR0104 2PAR0101 3PAR0102 2

В этой таблице PARCode уникален
PARCode valuePAR0101 2PAR0102 PAR0103 PAR0104 2

Нужный результат
PARCode value zLODPAR0101 2LODPAR0101 7PAR0102 5PAR0104 2LODPAR0101 3PAR0102 2

Т.Е. если значения поля Value в таблицах совпадают, то функция возвращает результат "LOD", если нет то Null
...
Рейтинг: 0 / 0
24.03.2020, 12:15
    #39940499
Импорт данных из Эксель в две связанные таблицы
Если задача - найти значение из strPARAM в обеих таблицах (с учетом Null в поле "zLimit"), то это можно решить проще:
Код: vbnet
1.
2.
3.
4.
5.
  v = Dlookup("[zLimit]","[T_MOParam]","[MOPACODE]='" & strPARAM & "'")
If Not IsNull(v) Then
  v = Dlookup("[ANMOPACODE]","[T_MOANAL]","[ANMOPACODE]='" & strPARAM & "'")
End If
  Param_LOD = IIF(IsNull(v), Null, "LOD")


Какой тип полей "MOPACODE" и "ANMOPACODE"? Если числовой, то апострофы в условии не нужны, т.е.: Dlookup("[zLimit]","[T_MOParam]","[MOPACODE]=' & strPARAM)
...
Рейтинг: 0 / 0
24.03.2020, 14:28
    #39940559
WalkManX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из Эксель в две связанные таблицы
Кривцов Анатолий,
авторКакой тип полей "MOPACODE" и "ANMOPACODE"?
Тип полей текстовый, "MOPACODE" и "ANMOPACODE"
авторЕсли задача - найти значение из strPARAM в обеих таблицах
Задача не просто найти значения в обеих таблицах, а сравнить их и в случаи если значения совпадают вернуть "LOD"
ваш пример возвращает "LOD" просто если в "zLimit" есть значения
приведу пример работы функции
tab1
MOPACODEvalue PAR0101 2
tab2
ANMOPACODEzvaluePAR0101 2
сравниваем значения поля "value" и "zValue" в обеих таблицах, совпадает- функция возвращает "LOD",
во всех остальных случаях функция должна возвращать "null", даже если в поле "zValue" нет значения
...
Рейтинг: 0 / 0
25.03.2020, 14:04
    #39940991
WalkManX
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Импорт данных из Эксель в две связанные таблицы
Кривцов Анатолий,

На основе вашего совета удалось добится нужного результата.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Function Param_LOD(strPARAM As String, dblPARAM As Double) As Variant
Dim a As Double
 a = DLookup("[zLimit]", "[T_MOParam]", "[MOPACODE]='" & strPARAM & "'")
    If IsNull(dblPARAM) Or dblPARAM = 0 Then
     Param_LOD = Null
   Exit Function
End If
   If a = dblPARAM Then
    Param_LOD = "LOD"
 End If
End Function


Спасибо вам огромное, здоровье и благополучие.
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Импорт данных из Эксель в две связанные таблицы / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]