2013-12-17 61 views
0

我有一些問題,以確定如何刪除錯誤我有使用FileHelpers與嚴格的選項。FileHelpers主/細節 - 選項嚴格在禁止遲到綁定

我初始化類MasterDetails

Private _res As MasterDetails() 

的函數調用MasterDetailEngine

Private Function ReadCsvFile(ByVal fileName As String, ByVal tipodoc As String) As Boolean 
engine = New MasterDetailEngine(GetType(CabecDocVgr), GetType(LinhasDocVgr), CommonSelector.MasterIfContains, 
              "@") 
      _res = engine.ReadFile(strStartPath) 
Return true 
End Function 

這是法師類:

<DelimitedRecord(";")> 
Public NotInheritable Class CabecDocVgr 
    Public TipoLinha As String 
    Public Doc As String 
    Public Entidade As String 
    Public DataDoc As String 
    Public RefDoc As String 
End Class 

這一個,對於詳細:

<DelimitedRecord(";")> _ 
Public NotInheritable Class LinhasDocVgr 
    Public Tipolinha As String 
    Public Artigo As String 
    Public Armazem As String 
    Public Localizacao As String 
    Public Lote As String 
    Public Qtd As Integer 
    Public UniMedida As String 
    Public DataValidade As String 
End Class 

每個主/細節都是創建一個帶有標題和相關行的新文檔。

出現的錯誤,我可以舉一個例子,當我調用主或詳細信息類的成員:

Private Function TransformaDocF(ByVal tipoDoc As String) As Boolean 

    For numdoc As Integer = 0 To _res.Length - 1 

     Dim documentosOrigem(0) As Object 
     Dim docOrigem As New GcpBEDocumentoCompra 
     Dim docDestino As New GcpBEDocumentoCompra 

     Dim query As String = String.Format("SELECT TOP 1 NumDoc FROM cabecdoc WHERE RefDocOrig='{0}'", 
              _res(numdoc).Master.doc) 

     Dim lista As New StdBELista() 
     lista = Motor.Consulta(query) 

     If Not lista.Vazia Then 
      If Not lista.NoInicio And Not lista.NoFim Then 
       Dim numeroDoc As Integer = CInt(lista.Valor("NumDoc")) 
       'bExecuta = True 
      End If 
     End If 

     docOrigem = Motor.Comercial.Compras.Edita("000", "VGR", "2013", _res(numdoc).Master.doc) 
     documentosOrigem(0) = docOrigem 

     docDestino.TipoEntidade = "F" 
     docDestino.Serie = "2013" 
     docDestino.Entidade = docOrigem.Entidade.TrimStart(CChar("0")) 
     'DocDestino.DataDoc = "01-01-2013" 
     docDestino.Tipodoc = "VFA" 
     docDestino.RefDocOrig = _res(numdoc).Master.refDoc 

     Try 
      If docOrigem.Linhas.NumItens > 0 Then 
       For numlinha As Integer = 0 To _res(numdoc).Details.Length - 1 
        If docOrigem.Linhas(numlinha + 1).Artigo = _res(numdoc).Details(numlinha).Artigo Then 
         docOrigem.Linhas(numlinha + 1).Quantidade = docOrigem.Linhas(numlinha + 1).QuantSatisfeita + 
                    _res(numdoc).Details(numlinha).Qtd 
        End If 
       Next 
      End If 
      Motor.Comercial.Vendas.TransformaDocumentoEX2(documentosOrigem, CType(docDestino, GcpBEDocumentoVenda), True) 
      Return True 
     Catch ex As Exception 

      MessageBox.Show(ex.Message) 
      Return False 
     End Try 

    Next 
    Return True 
End Function 

例如,調用_res(numdoc).Master.refDoc給我的錯誤:「選項嚴格On不允許後期綁定「

有關我需要修改的任何想法,以便錯誤可以消失?

謝謝

+0

你會得到什麼錯誤?另外,我看不到你的'FileHelpersEngine'被使用的地方。 – shamp00

+0

@ shamp00編輯用於舉例說明我如何使用MasterDetailsEngine以及錯誤。 –

回答

1

嘗試使用泛型。我不是很擅長VB.NET,但我認爲它應該看起來像這樣:

'declare _res as an array of MasterDetails<CabecDocVgr, LinhasDocVgr> 
Dim _res As MasterDetails(Of CabecDocVgr, LinhasDocVgr)() 

'instantiate the generic version of the FileHelpers engine 
Dim engine = New MasterDetailEngine(Of CabecDocVgr, LinhasDocVgr)(CommonSelector.MasterIfContains, "@") 

'should not cause 'late binding error' since the results are strongly typed 
_res = engine.ReadFile("") 
+0

這就是我需要的! :)沒有更多的錯誤。還有一件事。我有更多的類,我是否需要爲每對CabecX,LinhasDocX重複所有代碼,或者我可以簡化代碼以僅使用我需要的類在某個時刻? –

+1

您可以通過創建工廠方法來創建正確的FileHelpers引擎來避免重複代碼:類似'EngineFactory.Create(masterType as Type,detailType as Type)'這將返回一個新的'MasterDetailEngine(Of CabecDocVgr,LinhasDocVgr)'。 – shamp00

+1

使用泛型(如上)意味着'_res.Master'包含一個'CabecDocVgr'數組。使用非通用版本,它將包含一個「object」數組。當您嘗試執行'object'.'refDoc'時,會出現'後期綁定'錯誤。 (所以如果你在使用'refDoc'之前總是小心地把'Master'轉換爲正確的類型,那麼你仍然可以使用你的原始實現,但是使用泛型更清晰。) – shamp00

相關問題