Office中国论坛/Access中国论坛

标题: 如何在发货单上通过订单明细序号加载和修改订单子表记录上的订单状态和完成日期 [打印本页]

作者: yzc2011    时间: 2023-9-27 23:49
标题: 如何在发货单上通过订单明细序号加载和修改订单子表记录上的订单状态和完成日期
发货单中的订单明细是订单子表中明细序号字段,是子表主键,有唯一性。
如何在发货添加或修改记录时通过订单明细(即明细序号)来加载订单子表记录中的订单状态和完成日期。
从而可以在发货单上直接修改订单子表上的订单状态和完成日期。

[attach]64670[/attach]

[attach]64671[/attach]


作者: yzc2011    时间: 2023-9-30 12:38
各位大师帮帮忙!!怎么才能在加载发货单的同时,加载相对应的订单子表上的记录,

Private Sub Form_Load()
On Error GoTo ErrorHandler
Dim rst           As Object
Dim rstTmp        As Object
Dim strSQL        As String
Dim currentID     As String
CurrentDb.Execute "DELETE FROM TMP_发货_Detail"
If IsNull(Me.OpenArgs) Then
        Me.DataEntry = True
    End If
    If Me.DataEntry Then
        Exit Sub
    End If      
urrentID = Form_Frm_发货!Frm_发货_List_Child.Form.发货序号
strSQL = "select * from Tbl_发货 where 发货序号 ='" & currentID & "'"
Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
   rst.MoveFirst
      Me.发货序号 = currentID
      Me.明细主号 = "F" & Mid([currentID], 4, 6)
      ………………
      Me.备注 = rst!备注
rst.Close
strSQL = "select * from Tbl_发货_Detail where 发货序号 ='" & Me.发货序号 & "'"
Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
Set rstTmp = CurrentDb.OpenRecordset("TMP_发货_Detail")
Do Until rst.EOF
        rstTmp.AddNew
        rstTmp![发货序号] = rst![发货序号]
        rstTmp![发货单号] = rst![发货单号]
        rstTmp![订单明细] = rst![订单明细]
        ………………
        rstTmp![金额] = rst![金额]
        rstTmp![结算日期] = rst![结算日期]
        rstTmp.Update
        rst.MoveNext
    Loop
    rst.Close
    rstTmp.Close
    Me.Frm_发货_Edit_Detail_Child.Requery
ExitHere:
    Set rst = Nothing
    Set rstTmp = Nothing
    Exit Sub
ErrorHandler:
    MsgBox Err.Description, vbCritical
    Resume ExitHere
End Sub
Private Sub Cmd保存_Click()

If Me.DataEntry Then
  Call TJ
    Me.Frm_发货_Edit_Detail_Child.Requery
Else  
  Call XG
        DoCmd.Close acForm, Me.Name, acSaveNo   
        DoCmd.Restore
   
    End If
End Sub

Public Sub TJ()
Dim rst As Object
Dim rstTmp As Object
Dim strSQL As String
Dim currentID As String
Dim currentID1 As String

currentID = AutoNumStr("Tbl_发货", "发货序号", 6, "No:", "")   '用编号模块输入发货序号。

strSQL = "select * from Tbl_发货 "
Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)

rst.AddNew
rst!发货序号 = currentID
…………
rst![备注] = Me![备注]

rst.Update
rst.Close

strSQL = "select * from Tbl_发货_Detail WHERE [发货序号]='" & Me![发货序号] & "'"
Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
Set rstTmp = CurrentDb.OpenRecordset("TMP_发货_Detail")
Do Until rstTmp.EOF
        rst.AddNew
        rst![发货序号] = currentID
        rst![订单明细] = rstTmp![订单明细]
        …………
        rst![数量] = rstTmp![数量]
        rst![单价] = rstTmp![单价]
        rst![金额] = Round(rstTmp![数量] * rstTmp![单价], 2)
        rst.Update
        rstTmp.MoveNext
    Loop
    rst.Close
    rstTmp.Close

'将输入框清空
    Dim ctrl As Control
    For Each ctrl In Me.Form.Controls
        If (TypeOf ctrl Is TextBox And InStr(1, ctrl.Name, "合计") = 0) Or TypeOf ctrl Is ComboBox Then
                 ctrl = Null
       End If
    Next ctrl
CurrentDb.Execute "DELETE FROM TMP_发货_Detail"
Form_Frm_发货.Frm_发货_List_Child.Form.Requery

MsgBox "新增的记录保存成功!", vbInformation, "提示"
ExitHere:
    Set rst = Nothing
    Set rstTmp = Nothing
    Exit Sub
ErrorHandler:
    MsgBox Err.Description, vbCritical
    Resume ExitHere

End Sub
Public Sub XG()
Dim rst As Object
Dim rstTmp As Object
Dim strSQL As String
Dim currentID As String

strSQL = "select * from Tbl_发货 where 发货序号 ='" & Me.发货序号 & "'"
Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
rst.MoveFirst
rst.Edit
    rst![审核] = Me.[审核]
    …………
    rst![备注] = Me![备注]
   
    rst.Update
    rst.Close
CurrentDb.Execute "Delete from Tbl_发货_Detail WHERE [发货序号]='" & Me![发货序号] & "'"
strSQL = "select * from Tbl_发货_Detail WHERE [发货序号]='" & Me![发货序号] & "'"
Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
Set rstTmp = CurrentDb.OpenRecordset("TMP_发货_Detail")
Do Until rstTmp.EOF
        rst.AddNew
        rst![发货序号] = Me![发货序号]
        rst![订单明细] = rstTmp![订单明细]
        ………………
        rst![数量] = rstTmp![数量]
        rst![单价] = rstTmp![单价]
        rst![金额] = Round(rstTmp![数量] * rstTmp![单价], 2)
        rst.Update
        rstTmp.MoveNext     
    Loop
    rst.Close
    rstTmp.Close
   
MsgBox "修改后的记录保存成功!", vbInformation, "提示"
ExitHere:
    Set rst = Nothing
    Set rstTmp = Nothing
    Exit Sub
ErrorHandler:
    MsgBox Err.Description, vbCritical
    Resume ExitHere
End Sub
作者: roych    时间: 2023-10-6 23:30
简单一点的做法是用dlookup处理,如果订单状态和完成日期都是唯一值的话。
需要注意的是,使用dlookup时一定确保有这个记录,否则会报错。
当然,你也可以再创建一个rst记录集,下拉订单明细时把订单条件传入,然后再赋值给控件。
作者: yzc2011    时间: 2023-10-7 11:28
谢谢roych的回复,下面是单记录用于更改应收状态与完收日期,像发货这种多记录临时表,不知道怎么弄,就是有问题。能否帮忙做个实例,谢谢。
Private Sub JZ()   '加载
Dim rst As Object
Dim strSQL As String
Dim currentID As String
  currentID = Form_Frm_借贷收入_Edit.Form.对应号
  strSQL = "select * from Tbl_利息应收 where 应收单号 ='" & currentID & "'"
  Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
  rst.MoveFirst
     Me.应收状态 = rst!应收状态
     Me.实收日期 = rst!实收日期
  rst.Close
End Sub

Private Sub BC()   '保存
Dim rst As Object
Dim strSQL As String
Dim currentID As String
  currentID = Form_Frm_借贷收入_Edit.Form.对应号
  strSQL = "select * from Tbl_利息应收 where 应收单号 ='" & currentID & "'"
  Set rst = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
  rst.MoveFirst
  rst.Edit
  rst!应收状态 = Me.应收状态
  rst!实收日期 = Me.实收日期
  rst.Update
  rst.Close
End Sub

作者: roych    时间: 2023-10-7 20:26
其实就是加两列的问题。[attach]64682[/attach]
对于这个需求,其实我不是很理解的。以下是我的一些想法,供参考:

1、“订单明细”字段已经绑定了“订单状态”和“完成日期”,直接把组合框改为文本框赋值不就好了么?
2、条件设置为“生产”,“完成日期”为空了,直接用默认值不好么?甚至都不需要用组合框带出来。
3、如果是打算手动修改订单状态的话,按旧版本的由用户自行选择就好了,没必要再费这个工夫。
4、最后一点,如果由用户批量更新为“完成”,用当前日期作为完成日期,请参考第2点。
5、另外,也可以在"TMP_发货_Detail"表里加一个“选择”的是否类型字段,用户点选时更新订单状态和完成日期。
6、当然,也可以在主窗体里加一个复选框,勾选后,将第5点的“选择”字段全部勾选,点击“保存”按钮时,更新“选择”为“True”的记录,或者把这些记录追加到主表等等。
7、最后一点,个人觉得还是多一点根据业务来创建查询,尽量通过执行查询来完成数据的处理。一味用代码替代查询,无助于理解业务。
[attach]64681[/attach]

作者: yzc2011    时间: 2023-10-8 10:56
本帖最后由 yzc2011 于 2023-10-8 11:24 编辑

谢谢roych的回复。订单状态和完成日期在订单编辑窗体上本身就能更改。只是想偷赖,想在发货后直接在发货编辑窗体上来更改《Tbl_订单_Detail》表上的【订单状态与完成日期】。是想把原来的【生产】状态改为【完成】状态,同时添加完成日期。

不是要把【订单状态和完成日期】写入到《Tbl_发货_Detail》表中。

发货编辑窗体除了要加载与保存《Tbl_发货》表和《Tbl_发货_Detail》表外,还需要根据所加载的《Tbl_发货_Detail》表中的订单明细(明细序号)控件内容来加载《Tbl_订单_Detail》表中的【订单状态与完成日期】,是要保存在原来的《Tbl_订单_Detail》表中。

概括就是想在发货编辑窗体上修改与保存《Tbl_订单_Detail》表上的订单状态与完成日期。

[attach]64686[/attach]








作者: roych    时间: 2023-10-9 17:35
把tmp_发货_Detai跟Tbl_订单_Detail关联后,点击保存时更新就好了。晚点我再看看。--2023-10-09 19:30更新 --
添加附件:
[attach]64691[/attach]

看看是不是这样

作者: yzc2011    时间: 2023-10-9 21:29
本帖最后由 yzc2011 于 2023-10-9 21:41 编辑

谢谢roych的回复,其实订单有好几个状态,分别是:待审、待产、生产、完成、取消。你上面的方法是能更改订单状态,但是在实际操作中还是有漏洞。会造成订单状态混乱。因为看不到当前订单状态。如是发生退货,需要更改订单表中的订单状态为待产或取消,或是其它状态。而在发货表上已有发货记录上不能显示此状态。另在保存时,如是订单状态不设默认值为【生产】,那么就是【空值】。设了【生产】,如是在订单状态不是【生产】时,这样会乱套了。因为要考虑到发货单修改问题。在修改时要知道当前订单状态。

有没有办法,可以在发货编辑窗体上能看到当前订单记录的订单状态。就跟下面的单记录【运营收入】编辑窗体能加载与保存【运营应收】的“应收状态”一样。
如附件【进销存-231009】中,用代码在【运营收入】窗体中加载和保存【运营应收】表中的“应收状态”。这是单记录的情况下的方式。

[attach]64692[/attach]
在运营收入编辑窗体分别在加载与保存中调用下面的运营应收的加载与保存。这是单记录,可以做到。
[attach]64694[/attach]

[attach]64693[/attach]





作者: roych    时间: 2023-10-9 23:46
我觉得你最好捋一下。按我理解,入库或者出货了,这张单就完成了。
至于退货什么的,应该创建新的订单,而不是在旧的订单里处理。
因为在旧的订单里处理,那货期怎么算?算延误?还是重新更新订单日期?如果更新的话,那么流程上,你又如何把它跟之前的生产日期区分出来?如果需要追溯,查看哪里导致退货的话,你又该如何应对?

生产的流程其实很复杂的。你这个很小的疑惑,已经暴露出数据库设计的问题了。

-----------题外话-----------

另一个思路,可以参考SAP的做法。

以前我在工厂的时候,释放订单后,有crt(create,创建)改为rel(release,释放),然后按工艺添加记录(比如有5个工艺流程,就添加5行)。
一般来说,第一步完成后,扫条形码改为cfm(confirm,确认)。下一步才能执行(除非工艺里设置下一步可以跳过)。
打包装后,生产部门的订单就完成了,后续就是仓库入库或者出货的事情。

---退货怎么办?
退货只是仓库处理,订单状态不会更改。因为这张单已经完成了。
--返修怎么办?
如果只是生产部门返修,就取消确认步骤,更改为释放状态,返修后再更改。如果是退货,基本上是没有返修的,都是重新下单来做。退回来那部分按残次品处理。

最后一点,你不能指望数据库来解决所有流程上的问题。在某种程度上,它只是帮助你优化或者捋顺流程而已。

像SAP这个做法很清晰,但实现起来并不算太容易。
首先你要有一个放单的(我们叫“计划科”),然后要管理好参数,比如,放单时选择工艺,就生成各个步骤的初始状态。
其次,流水线上要按照SOP操作,每一步都确认了才能去下一个工艺(事实上我们追急单时经常发现,一些订单成品已经到了仓库,生产工艺步骤很多漏做确认的)。
作者: yzc2011    时间: 2023-10-10 11:25
本帖最后由 yzc2011 于 2023-10-10 17:37 编辑

谢谢roych的答复。想请问一下,通过代码能不能实现,根据发货编辑子窗体上的订单明细内容来加载和保存订单子表上的订单状态与完成日期。谢谢。




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3