К сожалению не помогло. Выкладываю полный проект:
Есть Главная форма frmMain (Родительская), Форма со списком структур frmStructNav (Дочерняя), Форма редактирования струтуры frmStructInp (Дочерняя), Главный модуль mdlMain.
в frmMain - просто строка меню.
mdlMain:
- Код: Выделить всё
Public cn As New ADODB.Connection
Public rsStri As New ADODB.Recordset
Public rsStrn As New ADODB.Recordset
Sub Main()
cn.CursorLocation = adUseClient
cn.Open "PROVIDER=MSDataShape;Data PROVIDER=MSDASQL;dsn=db12;uid=;pwd=;"
Set rsStri.ActiveConnection = cn
rsStri.CursorLocation = adUseClient
rsStri.CursorType = adOpenKeyset
rsStri.LockType = adLockBatchOptimistic
rsStri.Source = "SHAPE {SELECT StructureID,StructureName,ProductTypeName,StructurePrice FROM Structures} AS ParentCMD APPEND ({SELECT StructureDetails.StructureID,StructureDetails.RawName,StructureDetails.Part,[RawPrice]*[Part] AS PartPrice FROM StructureDetails INNER JOIN Raw ON Raw.RawName = StructureDetails.RawName} AS ChildCMD RELATE StructureID TO StructureID) AS ChildCMD"
rsStri.Open
Set rsStrn.ActiveConnection = cn
rsStrn.Source = "Select * from Structures"
rsStrn.CursorType = adOpenKeyset
frmMain.Show
End Sub
frmStructNav:
- Код: Выделить всё
Private Sub Form_Load()
'Создание переменной списка
Dim lv As ListView
Set lv = lvMain
'Создание колонок списка
lv.ColumnHeaders.Clear
Dim clmX As ColumnHeader
Dim itmX As ListItem
Set clmX = lv.ColumnHeaders.Add(, "Product", "Товар")
Set clmX = lv.ColumnHeaders.Add(, "Price", "Цена")
lv.GridLines = True
lv.FullRowSelect = True
'Заполнение списка
rsStrn.Open
lv.ListItems.Clear
Dim nCounter As Integer
For nCounter = 1 To rsStrn.RecordCount
Set itmX = lv.ListItems.Add(, , rsStrn.Fields(1))
itmX.SubItems(1) = FormatCurrency(rsStrn.Fields("StructurePrice"), 2)
rsStrn.MoveNext
Next nCounter
rsStrn.Close
End Sub
'Открытие формы frmStructInp
Private Sub lvMain_DblClick()
Dim frmSI As New frmStructInp
frmSI.Show
End Sub
frmStructInp:
- Код: Выделить всё
Dim bChanged As Boolean
Private Sub Form_Load()
'заполнение таблицы в форме
rsStri.MoveFirst
rsStri.Find "StructureName = '" & frmStructNav.lvMain.SelectedItem.Text & "'"
'Set rsStri.ActiveConnection = Nothing
Set StructureGrid.DataSource = rsStri("ChildCMD").UnderlyingValue
'макет таблицы
With StructureGrid
.Columns(0).Visible = False
.Columns(1).Button = True
.Columns(1).Locked = True
.Columns(1).Width = 3500
.Columns(2).NumberFormat = "#0.00"
.Columns(2).Width = 600
.Columns(3).NumberFormat = "#0.00"
.Columns(3).Width = 600
.Columns(3).Locked = True
End With
'заполнение полей формы
Dim n As Integer
For n = 0 To txtFields.Count - 1
Set txtFields(n).DataSource = rsStri
txtFields(n).DataField = rsStri.Fields(n).Name
Next n
Set rsStri.ActiveConnection = Nothing
End Sub
'при выгрузке запрос на сохранение изменений
Private Sub Form_Unload(Cancel As Integer)
Dim i As Integer
If bChanged Then
i = MsgBox("Сохранить?", vbYesNo, "Сохранение")
If i = vbYes Then
Set rsStri.ActiveConnection = cn
rsStri.MarshalOptions = adMarshalModifiedOnly
rsStri.UpdateBatch
End If
End If
End Sub
'запомнить изменение в таблице
Private Sub StructureGrid_Change()
bChanged = True
End Sub
В общем если создаешь rsStri в главном модуле - данные сохраняются, а если в модуле frmStructInp - то не сохраняются