財務接口4
怪異的象再次出現。終于發現了端倪,是因為根節點的問題。只有根節點是報表的鏈條是有效的。形成樹的要從根節點開始。254.得到了想
怪異的象再次出現。終于發現了端倪,是因為根節點的問題。只有根節點是報表的鏈條是有效的。形成樹的要從根節點開始。

254.得到了想要的結果,但娶的不是我的意中人。想把ID扔掉,但到頭來還是扔不掉。要自由,但脫不了ID鎖鏈。要實現報表科目與會計科目重名,又要科目可以有空的下級科目,有下級科目的科目可以單獨使用(有baby了又想單飛),要這些自由只能含淚戴上金箍兒,找富婆走上人生巔峰。內心是拒絕的,但是么得辦法。OOO,Only you....這是一個悲傷的故事。
Dim offCols, exStr, offRows, Rcset_stage2nSub 提取目標科目()n'全部采用程序計算而不用表公式實現所有功能。大量表公式影響效率n'excel表的輸出速度慢得不是一點點。noffCols = 3noffRows = 1nDim cnn As ObjectnDim Rcset As Object 'Rset竟然是保留字符號。nDim conncetStr, cnnStr, chainSheet, kemuStr, Rcset_1, Rcset_report, Rcset_2nSet cnn = CreateObject("ADODB.CONNECTION")nSet Rcset = CreateObject("ADODB.RECORDSET")nn'二級子節點,所有的父節點nSet Rcset_1 = CreateObject("ADODB.RECORDSET")nSet Rcset_2 = CreateObject("ADODB.RECORDSET")nSet Rcset_stage2 = CreateObject("ADODB.RECORDSET")nSet Rcset_report = CreateObject("ADODB.RECORDSET")nconncetStr = "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES';Data Source=" & ThisWorkbook.FullNamencnnStr = "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES'; Data Source=" & ThisWorkbook.FullNamencnn.Open cnnStrnts = "[期初余額_auto$A:M]"nSQL = "Select 序號,一級科目,二級科目,余額m,代碼,方向,類別 from " & ts & " where 序號='ledger' and 一級科目<>''"nRcset_stage2.Open SQL, cnn, 3, 1nchainSheet = "鏈表圖pro"nSQL_1 = "select distinct 一級科目 from " & ts & " where 序號='ledger'"nRcset_1.Open SQL_1, cnn, 3, 1n'全域內不允許重名就簡單,但報表科目與會計科目之間會有重名。nSQL_report = "Select 序號,一級科目,二級科目,余額m,代碼,方向,類別 from " & ts & " where 序號='report' and 一級科目<>''"nRcset_report.Open SQL_report, cnn, 3, 1nSQL_2 = "select distinct 一級科目 from " & ts & " where 序號='report'"nRcset_2.Open SQL_2, cnn, 3, 1nnnWith Worksheets(chainSheet)n .Selectn .Cells.Clearn '.[a1].CopyFromRecordset Rcset_reportn 'Do While Not Rcset_2.EOFn '神奇的樹,找到根節點,循環都省了。n kemuStr = "報表"n exStr = "report," & kemuStrn parentToChain Rcset_report, "一級科目='" & kemuStr & "'", kemuStr, chainSheet, 1n 'Rcset_2.movenextn 'Loopn n If 0 Thenn Do While Not Rcset_1.EOFn kemuStr = Rcset_1.fields(0).Valuen exStr = "ledger," & kemuStrn parentToChain Rcset, "一級科目='" & kemuStr & "'", kemuStr, chainSheet, 1n Rcset_1.movenextn Loopn End Ifn ''''分裂變身n n .Columns("A:A").Selectn Selection.TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _n TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _n Semicolon:=False, Comma:=True, Space:=False, Other:=False, TrailingMinusNumbers:=Truen nEnd WithnEnd SubnFunction parentToChain(Rcset, fstr, kemuStr, chainSheet, stage)nDim moffset, mexnDim rstFilterednSet rstFiltered = CreateObject("ADODB.RECORDSET")nSet rstFiltered = Rcset.ClonenrstFiltered.Filter = fstrnmoffset = offColsnmex = exStrn'''如果rstFiltered.countn'Debug.Print rstFiltered.RecordCountnIf rstFiltered.RecordCount <= 0 Thenn'''n '二級火箭點火ledgern Debug.Print "二級火箭準備:", kemuStrn If stage = 1 Thenn kemuStr2 = kemuStrn parentToChain Rcset_stage2, "一級科目='" & kemuStr2 & "'", kemuStr2, chainSheet, 2n Elsen '二級結束,熄火n End IfnElsen nDo While Not rstFiltered.EOFn With Worksheets(chainSheet)n .Cells(offRows, 1) = rstFiltered.fields(4).Value & "," & rstFiltered.fields(5).Value & "," & rstFiltered.fields(6).Value & "," & rstFiltered.fields(3).Value & "," & exStr + "," & rstFiltered.fields(2).Valuen offRows = offRows + 1n If rstFiltered.fields(2).Value <> "" Thenn offCols = offCols + 1n exStr = exStr + "," & rstFiltered.fields(2).Valuen parentToChain rstFiltered, "一級科目='" & rstFiltered.fields(2).Value & "'", rstFiltered.fields(2).Value, chainSheet, stagen offCols = offCols - 1n exStr = mexn Else n End Ifn End Withn'parentToChain rstFilteredn rstFiltered.movenextnLoopnEnd IfnnEnd Function
255.代碼改得爹媽不認。簡單的樹,變成了分節狀竹子。是否發明了一種新的數據結構叫做bamboo。各個節在空間上分開,每一層枝節雙在空間上對齊,前一層的枝尖與后一層的枝根部有順序鏈接,前一層枝尖(末)的節段值,是下一枝根的開始值。本來兩段是連在一起的,但是為了stage,階段字段的對齊,需要分開一段距離存儲。這樣的結構也可叫甘蔗結構。兩個stage之間分開的距離就是甘蔗的一節。
難道我已經深入數據庫對齊的峽谷盆地中了?是華容道、直布羅陀海峽、卡夫地峽谷、還是斷腸崖絕情谷?
我為什么這么鐘情干這個?看了自己都上火。sql 的group、sum功能難道那么誘人?直接弄個公式加加減減難道不香嗎?中的什么邪。目前東西是搞出來了,但是速度是慢出天際。
Dim offCols, exStr, offRows, Rcset_stage2, Maxcols(256) As Integer, StageStr(256) As String, LeadStr(256) As StringnConst CoffsetColumns = 6nConst CoffsetRows = 1nConst MaxStage = 2nSub 提取目標科目()n'全部采用程序計算而不用表公式實現所有功能。大量表公式影響效率n'excel表的輸出速度慢得不是一點點。nnMaxcols(0) = 1nfillMaxcolsnoffCols = 1noffRows = 1nDim cnn As ObjectnDim Rcset As Object 'Rset竟然是保留字符號。nDim conncetStr, cnnStr, chainSheet, kemuStr, Rcset_1, Rcset_reportnSet cnn = CreateObject("ADODB.CONNECTION")nSet Rcset = CreateObject("ADODB.RECORDSET")nn'二級子節點,所有的父節點nSet Rcset_1 = CreateObject("ADODB.RECORDSET")nSet Rcset_stage2 = CreateObject("ADODB.RECORDSET")nSet Rcset_report = CreateObject("ADODB.RECORDSET")nncnnStr = "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES'; Data Source=" & ThisWorkbook.FullNamencnn.Open cnnStrnts = "[期初余額_auto$A:M]"nchainSheet = "鏈表圖pro"nnSQL = "Select 序號,一級科目,二級科目,余額m,代碼,方向,類別 from " & ts & " where 序號='ledger' and 一級科目<>''"nRcset_stage2.Open SQL, cnn, 3, 1nnSQL_1 = "select distinct 一級科目 from " & ts & " where 序號='ledger'"nRcset_1.Open SQL_1, cnn, 3, 1n'全域內不允許重名就簡單,但報表科目與會計科目之間會有重名。nSQL_report = "Select 序號,一級科目,二級科目,余額m,代碼,方向,類別 from " & ts & " where 序號='report' and 一級科目<>''"nRcset_report.Open SQL_report, cnn, 3, 1nnWith Worksheets(chainSheet)n .Selectn .Cells.Clearn '.[a1].CopyFromRecordset Rcset_reportn 'Do While Not Rcset_2.EOFn '神奇的樹,找到根節點,循環都省了。 n n kemuStr = "報表"n exStr = "report," & kemuStrn parentToChain Rcset_report, "一級科目='" & kemuStr & "'", kemuStr, chainSheet, 1n 'Rcset_2.movenextn 'Loopn n ''''分裂變身n If 0 Thenn .Columns("A:A").Selectn Selection.TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _n TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _n Semicolon:=False, Comma:=True, Space:=False, Other:=False, TrailingMinusNumbers:=Truen End IfnEnd WithnnEnd SubnnFunction parentToChain(Rcset, fstr, kemuStr, chainSheet, Stage)n'如果stage=0就是單體運行nDim moffset, mexnnDim rstFilterednSet rstFiltered = CreateObject("ADODB.RECORDSET")nSet rstFiltered = Rcset.Clonenn''''相當于一個functionnrstFiltered.Filter = fstrnnmoffset = offColsnnmex = StageStr(Stage)n'''如果rstFiltered.countn'Debug.Print rstFiltered.RecordCountnIf rstFiltered.RecordCount <= 0 Thenn'''n '二級火箭點火ledgern 'Debug.Print "二級火箭準備:", kemuStrn '高階的入口n If Stage < MaxStage Thenn kemuStr2 = kemuStrn n LeadStr(Stage + 1) = kemuStr2n 'Debug.Print "here LeadStr(Stage) :"; LeadStr(Stage)n n parentToChain Rcset_stage2, "一級科目='" & kemuStr2 & "'", kemuStr2, chainSheet, Stage + 1n Elsen n n n n '二級結束,熄火n End IfnElsennn nDo While Not rstFiltered.EOFnn 'Debug.Print "here2 LeadStr(Stage) :"; LeadStr(Stage), "stage:", Stagennn With Worksheets(chainSheet)nn n If rstFiltered.fields(2).Value <> "" Thenn n n n '''同名問題,自動認為是進入ledger'一種情況父與子相同的情況。解決同名的出口問題,否則死循環n If rstFiltered.fields(2).Value = kemuStr Thenn n ''''啟動二級n If Stage = 1 Thenn 'Debug.Print "二級火箭準備:", kemuStrn kemuStr2 = kemuStrn LeadStr(Stage) = kemuStr2n parentToChain Rcset_stage2, "一級科目='" & kemuStr2 & "'", kemuStr2, chainSheet, 2n n Elsen n If Stage = 2 Then Debug.Print "會計科目不允許二級相同名稱:", kemuStrn n If Stage = 0 Then Debug.Print "當前運行中有相同名稱:", kemuStrn n End Ifn n n Elsen n offCols = offCols + 1n StageStr(Stage) = StageStr(Stage) + "," & rstFiltered.fields(2).Valuen n ''''輸出一波火力,實現不同stage的對齊,竹節狀數據,而且每層對齊。層級節節高,而每一節是個棵傘狀Tree結構。n n str0 = rstFiltered.fields(4).Value & "," & rstFiltered.fields(5).Value & "," & rstFiltered.fields(6).Value & "," & rstFiltered.fields(3).Value & "," & exStrn .Cells(offRows, 1) = str0n .Cells(offRows, CoffsetColumns) = StageStr(1)n n If (Stage > 1) Thenn 'Debug.Print " LeadStr(Stage) :", LeadStr(Stage)n n .Cells(offRows, CoffsetColumns + Maxcols(Stage - 1) + 1) = LeadStr(Stage) & StageStr(Stage)n Elsen n End Ifn n n n offRows = offRows + 1n n '''''輸出完了,繼續再戰n n parentToChain rstFiltered, "一級科目='" & rstFiltered.fields(2).Value & "'", rstFiltered.fields(2).Value, chainSheet, Stagen offCols = offCols - 1n StageStr(Stage) = mexn n End Ifn n Elsen n End Ifn End Withn'parentToChain rstFilteredn rstFiltered.movenextnLoopnEnd IfnEnd FunctionnnnSub fillMaxcols()noffCols = 3noffRows = 1nDim cnn As ObjectnDim Rcset As Object 'Rset竟然是保留字符號。nDim conncetStr, cnnStr, chainSheet, kemuStr, Rcset_1, Rcset_report, Rcset_2nSet cnn = CreateObject("ADODB.CONNECTION")nSet Rcset = CreateObject("ADODB.RECORDSET")nn'二級子節點,所有的父節點nSet Rcset_1 = CreateObject("ADODB.RECORDSET")nSet Rcset_2 = CreateObject("ADODB.RECORDSET")nSet Rcset_stage2 = CreateObject("ADODB.RECORDSET")nnSet Rcset_report = CreateObject("ADODB.RECORDSET")nnnnnnconncetStr = "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES';Data Source=" & ThisWorkbook.FullNamencnnStr = "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES'; Data Source=" & ThisWorkbook.FullNamencnn.Open cnnStrnts = "[期初余額_auto$A:M]"nnnnnSQL = "Select 序號,一級科目,二級科目,余額m,代碼,方向,類別 from " & ts & " where 序號='ledger' and 一級科目<>''"nnRcset_stage2.Open SQL, cnn, 3, 1nnchainSheet = "鏈表圖pro"nnSQL_1 = "select distinct 一級科目 from " & ts & " where 序號='ledger'"nRcset_1.Open SQL_1, cnn, 3, 1n'全域內不允許重名就簡單,但報表科目與會計科目之間會有重名。nSQL_report = "Select 序號,一級科目,二級科目,余額m,代碼,方向,類別 from " & ts & " where 序號='report' and 一級科目<>''"nRcset_report.Open SQL_report, cnn, 3, 1nnnoffCols = 1noffRows = 1nn'''''''''''''''''''nnMaxcols(1) = 1nkemuStr = "報表"nnparentToChain_only Rcset_report, "一級科目='" & kemuStr & "'", kemuStr, chainSheet, 1nn'Debug.Print Maxcols(1)nnnRcset_report.ClosennnoffCols = 1noffRows = 1nnMaxcols(2) = 1nn nn Do While Not Rcset_1.EOFn kemuStr = Rcset_1.fields(0).Valuen exStr = "ledger," & kemuStrn parentToChain_only Rcset_stage2, "一級科目='" & kemuStr & "'", kemuStr, chainSheet, 2n Rcset_1.movenextn Loopnn nMaxcols(2) = Maxcols(2) + Maxcols(1)nnnn'Debug.Print Maxcols(2)nnRcset_1.ClosennRcset_stage2.Closennncnn.ClosenEnd SubnnnnnnFunction parentToChain_only(Rcset, fstr, kemuStr, chainSheet, Optional Stage = 0)nnDim moffset, mex, rstFilterednnSet rstFiltered = CreateObject("ADODB.RECORDSET")nSet rstFiltered = Rcset.ClonennrstFiltered.Filter = fstrnnmoffset = offColsnnIf offCols > Maxcols(Stage) Then Maxcols(Stage) = offColsnn'Debug.Print stage, offCols, Maxcols(stage)nnmex = exStrn'''如果rstFiltered.countn'Debug.Print rstFiltered.RecordCountnnn nDo While Not rstFiltered.EOFn With Worksheets(chainSheet)n '.Cells(offRows, 1) = rstFiltered.fields(4).Value & "," & rstFiltered.fields(5).Value & "," & rstFiltered.fields(6).Value & "," & rstFiltered.fields(3).Value & "," & exStr + "," & rstFiltered.fields(2).Valuen offRows = offRows + 1n n n If rstFiltered.fields(2).Value <> "" Thenn '''同名問題,自動認為是進入ledger'一種情況父與子相同的情況。解決同名的出口問題,否則死循環n If rstFiltered.fields(2).Value = kemuStr Thenn n Debug.Print "當前運行有相同名稱:", kemuStrn n n Elsen n offCols = offCols + 1n exStr = exStr + "," & rstFiltered.fields(2).Valuen parentToChain_only rstFiltered, "一級科目='" & rstFiltered.fields(2).Value & "'", rstFiltered.fields(2).Value, chainSheet, Stagen offCols = offCols - 1n exStr = mexn n End Ifn n Elsen n End Ifn End Withn'parentToChain rstFilteredn rstFiltered.movenextnLoopnnEnd Function

256.從實用的角度來說。報表只需要總賬科目就可以。現在要解決的是會計科目的三級以上科目的問題。
257.百思不得其解。驀然回首,順序反了。老想著從子節點到根部,但發現數據污染,相互干擾。突然想到從根節點往葉子節點去,豁然開朗,別有洞天,漠漠水田飛白鷺,陰陰夏木囀黃鸝 。這人間勝景,可憐聊,兩天來烏云壓頂的腦扣扣。
驀然回首,你咋還沒走?青春有限,別自個添亂。

享受一波一路內置函數的快樂。一路dot點dot。 .Range("a1:a" & Rowsup).Find(fstr).Row
Sub 登報表數據pro(Optional ByVal mon = 1, Optional ByVal ts = "鏈表圖pro", Optional ByVal Vts = "憑證_auto")nApplication.ScreenUpdating = FalsenDim cnn As Object, Rowsup, Rcset As Object, RcA1 As Object, Sumstr, TsstrnDim SQL$, SQA$, SQB$nSet cnn = CreateObject("ADODB.CONNECTION")nSet Rcset = CreateObject("adodb.recordset")ncnn.Open "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=NO'; Data Source=" & ThisWorkbook.FullNamenTsstr = " [" & ts & "$A:Z] "nSQL = "select * from [" & ts & "$A:Z]"nnSumstr = ""nFor i = 2 To 13nSumstr = Sumstr & "sum(F" & i & "),"nNextnnSumstr = Sumstr & "sum(F14)"nSQL = "select F16," & Sumstr & "from " & Tsstr & " group by F16"nn'Debug.Print SQLnnWith Worksheets(ts)n Rowsup = .Cells(1000, 1).End(xlUp).Rown Rcset.Open SQL, cnn, 3, 1n 'Debug.Print Rcset.RecordCountn n Do While Not Rcset.EOFn fstr = Rcset.fields(0)n frow = .Range("a1:a" & Rowsup).Find(fstr).Rown Debug.Print fstr, frown n n n n n Rcset.movenextn LoopnnnEnd WithnnnEnd Sub
OK。完成一個小目標。

出現一個小插曲,廢了幾個腦細胞后順利通關。這個bug一捉,速度也上來了,思路也清晰了,腿腳也利索了,吃嘛嘛香,干嘛嘛棒。
'這里有bug,find默認是包含,而不是精確匹配
frow = .Range("a1:a" & Rowsup).Find(fstr, LookAt:=xlWhole).Row
Dim offCols, exStr, offRows, Rcset_stage2, Maxcols(256) As Integer, StageStr(256) As String, LeadStr(256) As StringnConst CoffsetColumns = 6nConst CoffsetRows = 1nDim MaxStagennnSub 報表過賬pro_main()nn鏈表圖reportnnts = "鏈表圖pro"nnFor i = 1 To 5nn報表過賬pro i, ts, "憑證_auto"nNextnWorksheets(ts).Selectn登報表數據pronnEnd SubnnnnSub 鏈表圖report()n'全部采用程序計算而不用表公式實現所有功能。大量表公式影響效率n'excel表的輸出速度慢得不是一點點。nnMaxcols(0) = 1nMaxStage = 1nnoffCols = 1noffRows = 1nnnDim cnn As ObjectnDim Rcset As Object 'Rset竟然是保留字符號。nDim conncetStr, cnnStr, chainSheet, kemuStr, Rcset_1, Rcset_reportnSet cnn = CreateObject("ADODB.CONNECTION")nSet Rcset = CreateObject("ADODB.RECORDSET")nn'二級子節點,所有的父節點nnnSet Rcset_report = CreateObject("ADODB.RECORDSET")nncnnStr = "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=YES'; Data Source=" & ThisWorkbook.FullNamencnn.Open cnnStrnts = "[期初余額_auto$A:M]"nchainSheet = "鏈表圖pro"nnn'全域內不允許重名就簡單,但報表科目與會計科目之間會有重名。nSQL_report = "Select 序號,一級科目,二級科目,余額m,代碼,方向,類別 from " & ts & " where 序號='report' and 一級科目<>''"nRcset_report.Open SQL_report, cnn, 3, 1nnnWith Worksheets(chainSheet)n .Selectn .Cells.Clearn '.[a1].CopyFromRecordset Rcset_reportn 'Do While Not Rcset_2.EOFn '神奇的樹,找到根節點,循環都省了。n n kemuStr = "報表"n exStr = kemuStrn parentToChain_1 Rcset_report, "一級科目='" & kemuStr & "'", kemuStr, chainSheetn 'Rcset_2.movenextn 'Loopn n ''''分裂變身n If 1 Thenn .Columns("A:A").Selectn Selection.TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _n TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _n Semicolon:=False, Comma:=True, Space:=False, Other:=False, TrailingMinusNumbers:=Truen End IfnEnd WithnnEnd SubnnFunction parentToChain_1(Rcset, fstr, kemuStr, chainSheet)nDim moffset, mexnDim rstFilterednSet rstFiltered = CreateObject("ADODB.RECORDSET")nSet rstFiltered = Rcset.ClonenrstFiltered.Filter = fstrnmoffset = offColsnmex = exStrnDo While Not rstFiltered.EOFnn With Worksheets(chainSheet)n ' .Cells.Clearn '.[A1].CopyFromRecordset rstFilteredn 'Debug.Print offRows, moffset, rstFiltered.RecordCount, mex, rstFiltered.fields(2).Valuen '+null值,整個字符串變nulln .Cells(offRows, 1) = rstFiltered.fields(2).Value & "," & rstFiltered.fields(3).Value & "," & String(12, ",") & exStr + "," & rstFiltered.fields(2).Valuen '.Cells(offRows, 1) = rstFiltered.fields(2).Value & "," & rstFiltered.fields(4).Value & "," & rstFiltered.fields(5).Value & "," & rstFiltered.fields(6).Value & "," & rstFiltered.fields(3).Value & "," & exStr + "," & rstFiltered.fields(2).Valuen offRows = offRows + 1n n If rstFiltered.RecordCount > 0 And rstFiltered.fields(2).Value <> "" Thenn offCols = offCols + 1n exStr = exStr + "," & rstFiltered.fields(2).Valuen parentToChain_1 rstFiltered, "一級科目='" & rstFiltered.fields(2).Value & "'", rstFiltered.fields(2).Value, chainSheetn offCols = offCols - 1n exStr = mexn End Ifn n End Withn'parentToChain rstFilterednn rstFiltered.movenextnLoopnnEnd FunctionnnnnnnnSub 報表過賬pro(Optional ByVal mon = 1, Optional ByVal ts = "鏈表圖pro", Optional ByVal Vts = "憑證_auto")nApplication.ScreenUpdating = FalsenDim cnn As Object, RowsupnDim SQL$, SQA$, SQB$nSet cnn = CreateObject("ADODB.CONNECTION")ncnn.Open "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=NO'; Data Source=" & ThisWorkbook.FullNamen'mon = 4n'''n'Rowsup = 列不為空所在行(1, 1000, ts) - 1 '減去標題行,數據區的行數nn科目余額表1 mon, VtsnnWith Worksheets(ts)nnRowsup = .Cells(1000, 1).End(xlUp).Rownn'本期發生數,本期發生m F12nSQLink = "select top " & Rowsup & " round([科目余額表1$a:m].F12,2) from [" & ts & "$A:A] left join [科目余額表1$a:m] on [" & ts & "$A:A].F1=[科目余額表1$a:m].F1"nncol = 2 + monn'沒有標題欄n .Range(.Cells(1, col), .Cells(500, col)).ClearCommentsn ' Debug.Print SQLinkn .Cells(1, col).CopyFromRecordset cnn.Execute(SQLink)nEnd WithnnEnd SubnnnSub 登報表數據pro(Optional ByVal ts = "鏈表圖pro", Optional ByVal Vts = "憑證_auto")n'''區分一下末級,還是計算科目會快點。n''''這樣直接從科目余額表登賬到報表。nApplication.ScreenUpdating = FalsenDim cnn As Object, Rowsup, Rcset As Object, RcA1 As Object, Sumstr, TsstrnDim SQL$, SQA$, SQB$nSet cnn = CreateObject("ADODB.CONNECTION")nSet Rcset = CreateObject("adodb.recordset")ncnn.Open "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=NO'; Data Source=" & ThisWorkbook.FullNamenTsstr = " [" & ts & "$A:Z] "nSQL = "select * from [" & ts & "$A:Z]"nnSumstr = ""nnnnFor i = 2 To 13nSumstr = Sumstr & "sum(F" & i & "),"nNextnnSumstr = Sumstr & "sum(F14)"nngcol = 16 '合計列名稱nnnFor gcol = 16 To 22nn SQL = "select F" & gcol & "," & Sumstr & "from " & Tsstr & "where F" & gcol & " <> '' group by F" & gcoln Debug.Print SQLn n With Worksheets(ts)n Rowsup = .Cells(1000, 1).End(xlUp).Rown Rcset.Open SQL, cnn, 3, 1n 'Debug.Print Rcset.RecordCountn n Do While Not Rcset.EOFn ' fstr = Str(Rcset.fields(0))'str(NULL)會讓excel意外退出,是個bugn fstr = Rcset.fields(0).Valuen '又是空值作怪,兩面防空值n If fstr = "" Then GoTo ln n '這里有bug,find默認是包含,而不是精確匹配n frow = .Range("a1:a" & Rowsup).Find(fstr, LookAt:=xlWhole).Rown n n Debug.Print col, fstr, frown n For i = 2 To 14n .Cells(frow, i).Value = Round(Rcset.fields(i - 1).Value, 2)n n Nextn n Rcset.movenextn n nl:n Loopn n End Withn n Rcset.Closen nNextnnEnd Sub
256.一招解決結轉憑證礙事問題。摘要前加“結轉憑證-”。SQL中咔擦一刀。
出門碰到烏鴉了。是我想多了嗎?
窮則獨善其身,富則是我想多了。

后來發現世界上還是好人多。ADO這么有愛心的人怎么會為難別人呢,即使是你not like。
問題找到了,是bug。字段名不要加引號,就那么簡單。
我們總說生活繁瑣,其實是自己不懂得品味。其實,人生就那么簡單,多點快樂,少點煩惱,累了就睡覺,醒了就微笑,閑了就找朋友多聚聚,做一個最單純的人,走一段最幸福的路
SQL = " select * from [憑證_auto$A:J] where ‘摘要' not like '結轉憑證-%'"
SQL = " select * from [憑證_auto$A:J] where 摘要 not like '結轉憑證-%'"
257.到這里應是可以小節一下。對樹的操作算是有點入門。從二維表走向空間樹。走了許多彎路,關鍵在于對于樹的層層匯總竟然是從上而下,而不是從下而上。這應該就是上躥下跳、吵吵巴火要找的密室鑰匙。原來如此,聽罷肝腸斷,一曲淚痕干。
曉鏡但愁云鬢改,夜吟應覺月光寒。蓬山此去無多路,青鳥殷勤為探看
258.大牛。明天拜讀。
ADO讀取Excel出現字符串被截斷而不完整的原因與解決辦法 - 百度文庫

259.數據庫對數據處理作用不可或缺。用python來實現樹、鏈表總找不到匯總的辦法,得自己造輪子。python里找到了排序的辦法,也是通過自建類來實現,然后篩選出結果的話,肯定還要退一層,不能直接抓到內存的矩陣,因為壓根人家不是用相鄰內存塊實現的。
260.找到一個,就知道這么成熟的數據結構,不可能不能從存儲生成實例對象。
關系列表,這個稱呼好,我給起的名字叫PC表。
就知道,了解了,馬上安排。
這個功能是成圖。需要的功能更復雜,要成單鏈,而且是要分級對齊成二維表。
這個功能對檢查孤鏈的存在,很合適。

用這個庫networkx ,('a', 'b') 表示頂點'a' 和頂點'b' 有一條邊。

261.昨天卡在ADO拿不到混合數據中的字符串的門縫里。今天用EXCEL公式,把數字轉成熟悉的樣子。

搞出來了,但是出現了EXCEL表的閃退。
原來是PC表出現了問題。無限循環了。父子同名。


Dim offCols, exStr, offRows, Rcset_stage2, Maxcols(256) As Integer, StageStr(256) As String, LeadStr(256) As StringnConst CoffsetColumns = 6nConst CoffsetRows = 1nDim MaxStagennnSub getTreeChain(Optional ByVal Ts = "TreeChain")n'全部采用程序計算而不用表公式實現所有功能。大量表公式影響效率n'excel表的輸出速度慢得不是一點點。nnMaxcols(0) = 1nMaxStage = 1nnoffCols = 1noffRows = 1nnnDim cnn As ObjectnDim Rcset As Object 'Rset竟然是保留字符號。nDim conncetStr, cnnStr, chainSheet, kemuStr, Rcset_1, Rcset_reportnSet cnn = CreateObject("ADODB.CONNECTION")nSet Rcset = CreateObject("ADODB.RECORDSET")nn'二級子節點,所有的父節點nnnSet Rcset_report = CreateObject("ADODB.RECORDSET")nncnnStr = "Provider=Microsoft.ACE.OleDb.12.0;Extended Properties='Excel 12.0;HDR=NO'; Data Source=" & ThisWorkbook.FullNamencnn.Open cnnStrnTstr = "[PCtree$D:E]"nchainSheet = TsnnnnSQL = "select * from " & TstrnnnnRcset_report.Open SQL, cnn, 3, 1nnnWith Worksheets(chainSheet)n .Selectn .Cells.Clearn .[a1].CopyFromRecordset Rcset_reportn 'Do While Not Rcset_2.EOFn '神奇的樹,找到根節點,循環都省了。n n kemuStr = "刑事案由"n exStr = kemuStrn parentToChain_TreeChain Rcset_report, "F2='" & kemuStr & "'", kemuStr, chainSheetnnn n ''''分裂變身n If 0 Thenn .Columns("A:A").Selectn Selection.TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _n TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _n Semicolon:=False, Comma:=True, Space:=False, Other:=False, TrailingMinusNumbers:=Truen End IfnEnd WithnnEnd SubnnFunction parentToChain_TreeChain(Rcset, fstr, kemuStr, chainSheet)nDim moffset, mexnDim rstFilterednSet rstFiltered = CreateObject("ADODB.RECORDSET")nSet rstFiltered = Rcset.ClonenrstFiltered.Filter = fstrnmoffset = offColsnmex = exStrnDo While Not rstFiltered.EOFnn With Worksheets(chainSheet)n n '還有子節點 父節點輸出一級n .Cells(offRows, 1) = exStr + "," & rstFiltered.fields(1).Valuenn offRows = offRows + 1n n '相當于一級科目不能于""n If rstFiltered.RecordCount > 0 And rstFiltered.fields(1).Value <> "" Thenn offCols = offCols + 1n exStr = exStr + "," & rstFiltered.fields(0).Valuen parentToChain_TreeChain rstFiltered, "F2='" & rstFiltered.fields(1).Value & "'", rstFiltered.fields(1).Value, chainSheetn offCols = offCols - 1n exStr = mexn End Ifn n End Withn'parentToChain rstFilterednn rstFiltered.movenextnLoopnnEnd Function
261.發現現在做的是一個簡單的事情,因為程序明確知道根節點。如果,不知道,那又是另一回事情了。細思極恐。剛出狼窩,又入虎穴。城市套路深,還是回農村,古人誠不欺我。
不需要用到遞歸,可以直接不斷循環找出 parentID直到parentID為空
回復 點贊
這位老兄給出了一個思路。就是盯住父節點。
突然發現,如果考慮到樹的存儲結構,找爹是件再容易不過的事情。
如果是PC結構的,找沒爹的爹就是了。select * where 爹=''。一句搞定。
262.神辦法解決報表項目與會計科目重名的問題。不需多想,不需多看,直接連上就開干。會計科目用二級搞定所有。為什么,因為報表項目與會計科目重名,還不是一路的可能性幾乎為零。總沒有那么欠的人,故意搞事情。再打個比方,有人和皇帝重名,還要和皇帝對著干,這樣的系統肯定不是一個穩定的系統。就像三體世界,到頭總有一個會被搞廢掉。

263.碰到靈異事件了。這就是數據類型不確定的坑。.
竟然篩選不到!導入access也不行。
SQL = "select * from " & Tstr & " where 序號='report' and 一級科目<>'' and 二級科目=''"
Rcroot.Open SQL, cnn, 3, 1
把數字改成0就行了。太欺侮人了。
select * from [期初余額_auto$A:M] where 序號='report' and 一級科目<>'' and 二級科目='0'
加入一個“‘ ”單引號,或者一個返回“”的公式也可以。
用公式也行。
SQL = "select 一級科目 from " & Tstr & " where 序號='report' and 一級科目<>'' and iif(ISNULL(二級科目),'',二級科目)=''"
太恐怖了。太恐怖了。問題是它一會兒行,一會不行。<>是行的,=不行。
太委屈。太委屈,委屈巴巴,超想要大白一樣的抱抱,來治愈我的一切。
什么歲月靜好, 哪有什么歲月靜好,不過是有人替你負重前行!
好人做到底,最討厭做了一處,其他處處漏風。
奇怪的是access中都不行。可能這真是一個空值,其他的都是空字符串。
搞大了,搞大了,乖乖得搞死數據類型和默認值。要這樣死相,太難看了。
什么歲月靜好,你特么就是懶。而且是被別人拐了,還不知道轉彎,以為自己走錯了。繼續軸,就給人家去填坑吧。傻叉。


264.還是ID的問題,如果要簡單的匯總,那么需要全域范圍內名稱不能重復。如果只是兩級,別說兩級,就是N級,也解決不了重復混淆的問題。如果用ID就回到分區域代碼的老路上去了,而且會發現老辦法是最合理的。如果隨機的代碼組成鏈接,可以滿足自由得要求,但是后期維護的時候將是一場噩夢。有點像UNICODE字符代碼的分區管理。一塊裝不下只能在另外的區域找擴展區域,最終區域沒有外部的登記表,就亂得爹媽不認。
無奈后面可能就還要回到老路上完成代碼、代碼位數的問題才能測地解決多級科目的問題。代碼可以在代碼可以在同一級內部實現自由。無論如何,同一一個父項目下面的子項不能出現重復。
表與表之間關聯要解決的還是普遍的KEY問題。要有關聯肯定要有不能混亂的KEY。可以有多個KEY,但不能混亂。
關系樹的維護可以通過關系列表,也可以方程公式。關系列表只實現了科目的集合,不包含科目之間的關系,用聚合函數可以簡單實現sum。
為什么要分表?為實現不用數字ID作為KEY。
如何展開三級科目?因為不同的二級科目下會有相同的三級科目名稱。
這碰到了解決XPATH的問題。設計XPATH就是結構文檔的問題,XML文檔。
似乎XML文檔作為視覺展示比較合適,如果作為數據存儲,降低效率不說,數據的匯總計算還要倒回到關系數據庫的方式上來。
憑證布局上可以采用,只顯示兩列,一級科目和二級科目,三級科目不顯示。在原來的數據表格后面添加可自由生長的存儲三級以上的科目數據。這樣調和可是部分與數據存儲的矛盾。
后面添加兩列,表示該科目的xpath,相當于鏈表,相當于文字版的ID
暈了。發現削掉ID是一個錯誤的事情。或者說是個無法在關系數據中混的事情。或者轉戰XML文檔。關鍵是XML中也還是要用到ID的。否則JQuery,$("#ID")這樣的語句干什么吃的。只是ID隨意,只要不在全域內重復就可以。只似乎找到了一個有意思的路徑。走XML的路徑。
上升到哲學高度。
人認知的意義范圍是有限的,而機器的存儲單元在無限延伸。人只有把有限的意義投身到無限的機器認知當中去。這是一項無限的為人民服務的偉大事業。
在有限的財務報表范圍內可以不用ID的鏈表。在會計科目中使用ID,同時也把會計科目讓給機器去登記與完成。
沒辦法的,用人類的語言與標記浩瀚的宇宙繁星,這事兒超出了言語能表達的范圍。
另一面說,人自己使勁作吧,大腦產生出來的可識別概念遠遠不夠用。你去給4G內存單元每個格子起個特別的網名試試看,看看腦袋夠不夠用。
個體的意識就是在概念的海洋中遨游,同時產生一些新的概念。
每次到哲學了,就是真正困難來的時候。
265.會計科目。厚道人家。
最新會計科目表(2021)_中國會計網
266.結構還是采取編碼、名稱的形式。發現會計科目的科目代碼自帶分級,反而比代碼+父級代碼+名稱的形式更簡單。
匯總的方式還是和分級的形式相同。代碼自由度可以放在末級上面。只要不是有子科目的科目都可以給自動編碼。刪除代碼的那個代碼也要固定下來。
確定好代碼長度后,就可以完成逐級匯總。字符串長度限制在256個字符,四個段位可以容納10000個科目。百萬級字典的詞條,字符串需要6Byte,用Int類型4Byte。從存儲上Int轉字符串比較好。四個Byte,十進制字符串最多10000,如果是數值的話,可以表示2^32,4G,4*1024^3=42,9496,7296≈43億字節,約標識43億個詞條,對于人類認知領域已經足夠。
科目寬度為4個位,那么數字上,萬位以上的數字表示科目級數,萬位一下的數字表示科目本身。用一個八位數字可是表示10000級科目、每級10000個科目。所以用一個整型INT表示科目就可以了。可視化輸出時轉換成string。0~19999為一級科目,20000~29999為二級科目,N0000~N9999為N級科目,N為0~9999之間的數字。
用兩個字節表示科目也夠用。4個比特為表示級數,16級,夠用了。每一級,4096個科目也足夠用了。科目代碼使用無符號短整型。
這樣一個INT,四個字節可以表示自身代碼+父級代碼
計算的時候先用正負數表示,類別代碼不編入。低兩個字節解決唯一性,高兩個字節解決鏈表。

清醒認識Python的真面目:
Python 支持三種不同的數值類型:整型(int)、浮點型(float)、復數(complex)。在其他的編程語言中,比如Java、C這一類的語言中還分有長整型(long)、短整型(short)這些類型。而python只有int類型,沒有long型和short型。
int的范圍
python2:
在32位機器上,整數的位數為32位,取值范圍為-2**31~2**31-1;
在64位系統上,整數的位數為64位,取值范圍為-2**63~2**63-1;
python3:
理論上長度是無限的(只要內存足夠大)
EXCEL VBA委屈一點。最多三級科目。4+2+3,9位可用。簡單10進制編碼。

VBA的Int、long都是有符號的。int相當于C的short。

266.所有正襟危坐的,看不出一點破綻的都是通向巨坑的道路,偉大的作品有血有肉。
怎么在原基礎上添加科目代碼。
會計科目顯示中文,不顯示數字就可以了。代碼單獨開一列。三級科目的中文顯示需要特別處理。或者再開一列,在打印憑證的時候,匯總到二級科目的單元格中。
方案采取二級以后的科目在二級中匯總顯示。匯總采用科目代碼,代碼中文顯示使用code表中的內容。這個對于存儲來說也是合理的,減少重復的中文代碼,在千萬條記錄的情況下,這個額外開銷是不可承受的。
267.又找到一個好玩的東西:AutoCAD VBA
268.財務軟件企業版,或者叫大數據版。
代碼,最后做視覺呈現。
code2表含科目代碼、三級中文顯示,這兩個都可以作為主KEY,是唯一的。
憑證的顯示也使用中文顯示格式,部分一級科目、二級科目。
在維護科目代碼環節會多事情。
269.紀念一下,當初為了產生空白列是怎么干的。
SQL = "select 摘要,一級科目,二級科目,空白,借,空白,貸 from [" & ts & "$a:i] where 月份='" & mon & "月' and 憑證號=" & vIndex
270.就因為不知什么時候少了"step2",結果怎個程序中途停掉。安全、穩定、健壯提到日程上。

字符串后面,多了一個“,”,會在sps_低值易耗品中增加一個空值“”,這個太危險了。
ps_低值易耗品 = "杭州南方機電市場埃港五金機電經營部,杭州富陽國華門窗配件有限公司,杭州瑞博機電設備有限公司,杭州盧達貿易有限公司,"
sps_低值易耗品 = Split(ps_低值易耗品, ",")
公式中數組公式極易出錯,點一下可能就破壞掉了。

流入、流出這些科目沒有納入報表的統計,出現報表不平。

271.解決一行中借貸都有數據的問題。開心。
方法是,分別對借、貸做group,而不是一次完成group。不知道有沒有干凈一點寫法,總感覺group by 后面又臭又長。
SQLA = "( select 月份,'',摘要,一級科目,二級科目,借,sum(貸) as 貸 from [憑證_auto$A:G] where 月份='" & mon & "月' and 一級科目<>'' and (iif(ISNULL(借),0,借)<>0 or iif(ISNULL(貸),0,貸)<>0) group by 月份,摘要,一級科目,二級科目,借 ) A"nnSQL = "select 月份,'',摘要,一級科目,二級科目,sum(借),貸 from " & SQLA & " where 月份='" & mon & "月' and 一級科目<>'' and (iif(ISNULL(借),0,借)<>0 or iif(ISNULL(貸),0,貸)<>0) group by 月份,摘要,一級科目,二級科目,貸 "

272.VBA設置Word不要保存恢復文件。
Options.SaveInterval = 0
273.InStrRev,還要這神仙函數。
sstr = "f:courtword.bat " & Selection.Text & " " & Left(ActiveDocument.Name, InStrRev(ActiveDocument.Name, "_")) & "orignial.txt"
Shell sstr, vbNormalFocus
274.還要這樣的神仙公司與神仙專利。人工智能已經開始如當初的半導體、電腦、網絡一樣如火如荼。

275.學藝不精,或者叫怎么和我想的不一樣。
select groupby 即使不用聚合函數,返回的竟然是、竟然是、竟然是唯一值。驚訝之情那一言表,竟然與distict同效果。誰給你的權利這樣做?誰給你的狗膽可以這樣設計?
pandas也是一死德性。group by里面沒有的字段,又不能select,一group就變成唯一。我只想根據一個字段匯總,另外的保持原樣就那么難嗎?
氣不過,繼續挖:
不在group中又要顯示,就是要套一個函數上去,MIN、MAX之類。
- Select Min(AuditDT) Min_AuditDT,AppNum,MIN(Id) from TA Group by AppNum)
278.AutoIt
WinGetHandle
| Success: | a handle to the window. |
Run ( "program" [, "workingdir" [, show_flag [, opt_flag]]] )
Local $iPID = Run("notepad.exe", "", @SW_SHOWMAXIMIZED)
目標從PID找到程序的主窗口。
Local $sWow64 = "" If @AutoItX64 Then $sWow64 = "Wow6432Node" Local $sFile = RegRead("HKEY_LOCAL_MACHINESOFTWARE" & $sWow64 & "AutoIt v3AutoIt", "InstallDir") & "include_ReadMe_.txt" ; Execute the readme file (.txt) with the default editor used for text files in Windows. Local $iPID = ShellExecute($sFile)
通過WinWait
Run("notepad.exe")
Local $hWnd = WinWait("[CLASS:Notepad]", "", 10)
Local $hControl = ControlGetHandle($hWnd, "", "Edit1")
ControlSetText($hWnd, "", "Edit1", "This is some text")
ControlSetText ( "title", "text", controlID, "new text" [, flag = 0] )
很多種方法獲取窗口:
WinWaitActive("[TITLE:My Window; CLASS:My Class; INSTANCE:2]", "")
這個方法最香Retrieves a list of windows.
WinList("[REGEXPTITLE:(?i)(.*SciTE.*|.*Internet Explorer.*)]")
依葫蘆畫瓢,驗證有效。真香,控制欲滿足
;Local $aList=WinList("[REGEXPTITLE:(?i)(.*SciTE.*|.*Internet Explorer.*)]")
getprofile.au3
Local $filepro=WinGetHandle("[REGEXPCLASS:(FileLocatorProMainFrame*)]")nif @error ThennRun("f:FileLocator ProFileLocatorPro.exe")n$filepro=WinWait("[REGEXPCLASS:(FileLocatorProMainFrame*)]")nEndIfnnWinActivate($filepro)n;ControlSetText($filepro, "", "Edit3", "This is some text")nControlSetText($filepro, "", "Edit3", $CmdLine[1])nControlSetText($filepro, "", "Edit2", $CmdLine[2])nControlSetText($filepro, "", "Edit4", $CmdLine[3])nControlClick($filepro, "", "Button6")
老玩法,獲取命令行參數。有點愛上AutoIt。多年前被折磨得,這會兒得到一點爽。
$CmdLine[0] 獲取的是命令行參數的總數,在上例中$CmdLine[0]=3
$CmdLine[1]~$CmdLine[63] 獲取的是命令行參數第1到第63位,這個方式最多只能獲取63個參數,不過正常情況下是足夠用的
$CmdLineRaw 獲取的是未拆分的所有參數,是一個長字符串,這種情況下不局限與63個參數
點擊操作,像極了控制瀏覽器,終于會師了。厲害了,我的AutoIt。可以昭告天下,雜家又升級啦!
ControlClick($hWnd, "", "Edit1")
word.bat
cd /d e:courtnecho ==========%1==========>>flog.txtn"notepad++.au3" %1n"getprofile.au3" %1nn::start "" "E:FileLocator ProFileLocatorPro.exe" -d E:python -c %1 -f %2 -rn::start fpro.bat %1 %2 %3nfindstr %1 E:python漢語詞庫*.txt >ftmp.txtnntype ftmp.txtntype ftmp.txt >>flog.txtnpython mjieba.py -w:%1npausenexit
疏通疏通,爽。
“身無彩鳳雙飛翼,心有靈犀一點通”
蓋聰明疏通者戒于無斷,湛靜安舒者戒于后時,廣心浩大者戒于遺忘
VBA:
Sub gethighlight() 'n Options.SaveInterval = 0n With Selectionn Debug.Print Selection.Textn sstr = Selection.Text & " " & Left(ActiveDocument.Name, InStrRev(ActiveDocument.Name, "_")) & "orignial.txt" & " " & ActiveDocument.Path n Debug.Print sstrn ShellExecute 0, "runas", "f:courtword.bat ", sstr, vbNullString, SW_SHOWNORMALn 'Shell sstr, vbNormalNoFocus n End With nEnd Sub
279.AutoIt 卡殼了。目前無法對其他程序中的Tab頁操作。
記得有一個神器可以查看主窗口下所有下級窗口。先放放,湊活能用先。

280.當誰都在說python的時候,你需要了解Go。
現代語言肯定有現代語言的優勢。
初步感覺,python是腳本的升級,Go類似于C#,是C的升級。
go支持并發,總而言之,從工程的角度上來看,對于大多數后臺應用場景,選擇Golang是極為明智的選擇。 這樣可以很輕松的兼顧運行性能、開發效率及維護難度這三大讓諸多程序猿欲仙欲死的奇點。
astaxie/build-web-application-with-golang
C數組的全世界欲仙欲死的痛,go的slice讓你一直爽。
go語言中的slice - Kingram - 博客園
281.用go重寫自動生成憑證部分。
282.安裝
The Go Programming Language
這個域名沒被墻掉,說明危害性還不大。

按轉包一路確定:

只有光禿禿的,ide、編輯器撒都沒有。
安裝完成后默認會在環境變量 Path 后添加 Go 安裝目錄下的 bin 目錄C:Gobin,并添加環境變量 GOROOT,值為 Go 安裝根目錄C:Go。

這樣算是,有go了。

這是咋啦?
查明,由于安裝時改變了默認的安裝路徑。手動修改吧

修改后:

當看到需要版本控制,也就是說不通版本之間還不兼容。這絕對是個巨坑。
來個IDE當阿姨。找個阿姨好辦事。沒想到,竟然是VScode拔得頭籌。
astaxie/build-web-application-with-golang
無法訪問:
http://www.golang.org/

1、查看go 的環境變量 在cmd中 輸入go env
設置GOPROXY代理:
go env -w GOPROXY=https://goproxy.cn,direct
設置GOPRIVATE來跳過私有庫,比如常用的Gitlab或Gitee,中間使用逗號分隔:
go env -w GOPRIVATE=*.gitlab.com,*.gitee.com
如果在運行go mod vendor時,提示Get https://sum.golang.org/lookup/xxxxxx: dial tcp 216.58.200.49:443: i/o timeout,則是因為Go 1.13設置了默認的GOSUMDB=sum.golang.org,這個網站是被墻了的,用于驗證包的有效性,可以通過如下命令關閉:
go env -w GOSUMDB=off
可以設置 GOSUMDB="http://sum.golang.google.cn", 這個是專門為國內提供的sum 驗證服務。
go env -w GOSUMDB="sum.golang.google.cn"
"F:Gobingo.exe get -v http://github.com/uudashr/gopkgs/v2/cmd/gopkgs"
http://goproxy.cn
"F:Gobingo.exe get -v http://goproxy.cn/uudashr/gopkgs/v2/cmd/gopkgs"
天坑,填坑。差一點被這篇文章帶跑偏了。其他問題沒有解決,突然又冒出一個git命令來。
vscode 安裝go第三方擴展包填坑記錄
10、vscode自動安裝失敗,執行手動安裝
第一步先在%GOPATH%srcgolang.orgx目錄下打開git bash(如果沒有對應的golang.org目錄,可手功創建),執行git clone http://github.com/golang/tools。(手動安裝第三方類包時,必須先安裝tools類包)必須用git來clone,否則安裝其他組件如go get -u -v github.com/cweill/gotests。會出現package golang.org/x/tools/imports:directory"D:GoPathsrcgolang.orgxtoolsimports" is not using a known version control system錯誤。
第二步tools下載好后,進入%GOPATH%srcgolang.orgxtoolscmdgorename目錄,按shift+右鍵選擇在此打開命令窗口,執行go install,guru也執行同樣操作。
第三步在命令行窗口執行go get -u -v github.com/newhook/go-symbols,安裝go-symbols。其他幾個同樣執行此操作,包鏈接見下。
有吃一鯨,powershell還要這功能。
Windows
打開你的 PowerShell 并執行
C:> $env:GO111MODULE = "on"nC:> $env:GOPROXY = "https://goproxy.cn"
添加兩個環境變量后,手動下載,VScode失敗的內容。
再加一個:
GOSUMDB="http://sum.golang.google.cn"
這基本已經不是一般人能夠玩的了。

苦難的中國人,給開一個窗口就可以擠壓生長。
go.exe get -v github.com/uudashr/gopkgs/v2/cmd/gopkgs
go.exe get -v http://github.com/ramya-rao-a/go-outline
go.exe get -v http://github.com/cweill/gotests/...
go.exe get -v http://github.com/fatih/gomodifytags
go.exe get -v http://github.com/josharian/impl
go.exe get -v http://github.com/haya14busa/goplay/cmd/goplay
go.exe get -v http://golang.org/x/lint/golint
go.exe get -v http://golang.org/x/tools/gopls
Installing 7 tools at F:Gobin in module mode.
go-outline
gotests
gomodifytags
impl
goplay
golint
gopls
如果在運行go mod vendor時,提示Get https://sum.golang.org/lookup/xxxxxx: dial tcp 216.58.200.49:443: i/o timeout,則是因為Go 1.13設置了默認的GOSUMDB=sum.golang.org,這個網站是被墻了的,用于驗證包的有效性,可以通過如下命令關閉:ngoenv-w GOSUMDB=offn私有倉庫自動忽略驗證n可以設置 GOSUMDB="sum.golang.google.cn", 這個是專門為國內提供的sum 驗證服務。ngoenv-w GOSUMDB="sum.golang.google.cn"goenv-w GOSUMDB="sum.golang.org"n-w 標記 要求一個或多個形式為 NAME=VALUE 的參數, 并且覆蓋默認的設置
vscode,編譯go,兩條路,一條下載code runner。微軟的東西就是華華麗麗,vim一樣能有插件,如果不是做批處理,手摸的感覺還是vs。第二條,terminal。VBA都有這種窗口,想來VScode里肯定也不會缺席。

go run hello.go。沒讓人失望。兩個小時的折騰,換來了一聲“Hello word”。這百轉千回,關鍵還在于環境變量的設置。一人一個說法,最終從http://goproxy.cn中找到了,windows破解問題的入口:設置環境變量。問題解決,就是有點費環境變量。

283.西天取經,九九八十一。邊打妖怪,邊前行。
數據的規范化,勢在必行。
現在數據隨便填,后期bug滿天飛,這誰惹得禍?定是那斯data不合規。
先接通數據庫與go:
go get -u http://github.com/go-sql-driver/mysql

順路把git的問題解決了。天下一大怪,git不在git.com,在http://git-scm.com。
Git - Downloads

繼續踩坑:
Golang 提供一個環境變量 GO111MODULE 來設置是否使用mod,它有3個可選值,分別是off, on, auto(默認值),具體含義如下:nnoff: GOPATH mode,查找vendor和GOPATH目錄nnon:module-aware mode,使用 go module,忽略GOPATH目錄nnauto:如果當前目錄不在$GOPATH 并且 當前目錄(或者父目錄)下有go.mod文件,則使用 GO111MODULE, 否則仍舊使用 GOPATH mode。
$env:GO111MODULE = "on"
path和root的路徑src均找不到所需的包,卻在/pkg/mod下找到了。
人生的苦,有誰知道。為自己感動到了,為中國像自己一樣學習者的人感動到了。
后查了下原因,發現是因為開了代理之后,
GO111MODULE=on
這個參數會將包放在那一塊,所以這會兒可以關閉這個參數
go env -w GO111MODULE=off
然后重新下載依賴
go get -u http://github.com/go-sql-driver/mysql
package github.com/go-sql-driver/mysql: cannot download, F:Go is a GOROOT, not a GOPATH. For more details see: 'go help gopath'
手工復制:

set GO111MODULE=auto
不行就,手工復制一下。目前還沒找到修改配置的地方。
這一句非常有用:
log.Fatal("Open: ", err)
終于見到了彩虹。這特娘的辛苦誰知道。懷疑人生,懷疑學習的成本。這該怎么繼續。

雖然罵娘,但是錯誤處理、現代化的語法,可圈可點。python一時爽,錯誤一出有的忙。
panic,是什么東西?運行的時候,輸出錯誤信息如下

package mainnnimport (n "database/sql"n "fmt"n "log"n "time"nn _ "github.com/go-sql-driver/mysql"n)nn// ...nfunc main() {n db, err := sql.Open("mysql", "root:123456@/mydb")n if err != nil {n log.Fatal("Open: ", err)n //panic(err)n }n // See "Important settings" section.n db.SetConnMaxLifetime(time.Minute * 3)n db.SetMaxOpenConns(10)n db.SetMaxIdleConns(10)nn // Execute the queryn rows, err := db.Query("SELECT * FROM users")n if err != nil {n log.Fatal("Query: ", err)n //panic(err.Error()) // proper error handling instead of panic in your appn }nn // Get column namesn columns, err := rows.Columns()n if err != nil {n log.Fatal("Open: ", err)n //panic(err.Error()) // proper error handling instead of panic in your appn }nn // Make a slice for the valuesn values := make([]sql.RawBytes, len(columns))nn // rows.Scan wants '[]interface{}' as an argument, so we must copy then // references into such a slicen // See http://code.google.com/p/go-wiki/wiki/InterfaceSlice for detailsn scanArgs := make([]interface{}, len(values))n for i := range values {n scanArgs[i] = &values[i]n }nn // Fetch rowsn for rows.Next() {n // get RawBytes from datan err = rows.Scan(scanArgs...)n if err != nil {n log.Fatal("Open: ", err)n //panic(err.Error()) // proper error handling instead of panic in your appn }nn // Now do something with the data.n // Here we just print each column as a string.n var value stringn for i, col := range values {n // Here we can check if the value is nil (NULL value)n if col == nil {n value = "NULL"n } else {n value = string(col)n }n fmt.Println(columns[i], ": ", value)n }n fmt.Println("-----------------------------------")n }nn if err = rows.Err(); err != nil {n panic(err.Error()) // proper error handling instead of panic in your appn }nn}n
基于Dragonboat的幾個具體例子,本文分享了幾個常見的Go性能與使用問題。總結來說:
通過sharding分區減少contention是優化常用手段
做的再快也不可能比什么也不做更快,減少不必要操作比優化這個操作有效
多用Go內建的benchmark功能,數據為導向的做決策
官方提倡的東西肯定有他的道理,但在合適的情況下,需懂得如何無視某些官方的提倡
給,你要的 Go 學習路線圖來啦
283.越來越專業。詞匯,語法糖
舉個例子:在 C 語言里用 a[i] 表示 *(a+i),用 a[i][j] 表示 *(*(a+i)+j),由此可見語法糖不是“現代語言”獨有,這種寫法簡潔明了,易于理解。
a[i][j],一個連續的內存塊,分成i塊,每塊有j個內存單元。每個內存單元只能存一個數據,或者一個連接指針。
再議,樹、字典結構的實現:
所以,要在每一個節點上存一個名稱,可以做地址序號與名稱的映射表。也就是開兩個二位數組,一個數組存名稱,一個數組存數據。這兩個數組對應數據的位置相同。通過名稱(鍵)的位置就可以得到值得位置,一個通過值得位置反查得到名稱的位置。
另一個辦法就是結構體數組。一個二維數組存一個指向結構體的指針。
個人覺得前一個方法更好,可以實現雙向的查找、索引、篩選、增加。后一個方法,邏輯上更容易理解,但是查找、使用的時候,還是要建立索引。索引其實就是前一個方法建立的兩個數組或者其中的一個。
良月柒:不了解這12個語法糖,別說你會Java!
真是,一般培訓機構絕對不會這么說。因為他們自己都說不清楚。就是不想把問題說簡單。
似乎語法糖,就有點模板類的意思。這是當初看到尖括號就犯暈。
String...這個語法糖的本質是String strs[]。輸入的是多個逗號分隔的字符,正好是字符串數組的定義方式。也可以理解為什main函數入口的String[] args,而且main的參數就等價于String args[]。被C++嚇壞了,指針數組、數值指針的。指來指去,嚇死人。

Java SE5提供了一種新的類型-Java的枚舉類型,關鍵字enum可以將一組具名的值的有限集合創建為一種新的類型,而這些具名的值可以作為常規的程序組件使用,這是一種非常有用的功能。
enum就和class一樣,只是一個關鍵字,他并不是一個類。
這種方法似乎可以解決在EXCEL中碰到的空值問題。加一層判斷,在做會計運算的時候,只要默認為0,或者再摘要里默認“”,這其實是通過一個函數來判斷實現。這樣做的好處是,更加人性化,更加智能,但是成本就是編譯后的程序邏輯更加復雜,同步帶來的是系統開銷的增加。大數據量的情況下,哪怕多查詢一次都是小時級別的系統時間占用,更何況老是要驗證空字符。如果每開一厘米就要驗證是不是會發生交通事故,這車基本就成蝸牛了。問題是,何不最初就不產生空字符呢?或者就像C分配內存后直接就初始化0呢?
小賭怡情,大賭傷身。小搞搞就圖個樂呵,偷偷懶無妨。大搞項目,每一列初始化時就能確定空值究竟是0,還是空字符串“”,或者統一都是字符。
一切的根源就出在,計算機存儲的0不是我們眼睛看到的0。這樣沒什么奇怪的,都是數字1,1日元能等于1美元嗎?地界不同,各有各的規矩。人鬼殊途,數字世界就是ghost的世界。
內部類又稱為嵌套類,可以把內部類理解為外部類的一個普通成員。貌似,這個內部類無法訪問外部類的變量。
以上代碼編譯后會生成兩個class文件:OutterClass$InnerClass.class 、OutterClass.class 。
其實斷言的底層實現就是if語言,如果斷言結果為true,則什么都不做,程序繼續執行,如果斷言結果為false,則程序拋出AssertError來打斷程序的執行。
代碼很簡單,for-each的實現原理其實就是使用了普通的for循環和迭代器。
284.驀然回首,那人卻在燈火闌珊處。前朝filelocator pro不能被全控,剎是不爽。今日再拉出來一看,全文顯示可以與同一個mainframe里面。那天怎么抽風,會單獨一個mainframe。這樣就屁事沒有。庸人自擾。dis。

285.還是回到EXCE上來。調試階段EXCEL直觀自由。解決Go讀EXCEL
go get http://github.com/360EntSecGroup-Skylar/excelize
go get github.com/360EntSecGroup-Skylar/excelize/v2
下載了,但是找不到在哪里。
結果是因為文件名的原因。再正常情況下,下載后估計還要一個安裝動作。但是現在手動情況下,下載pkg目錄下,而包搜索在src目錄下,而且下載的名稱含有莫名其妙的字符。GOPATH再增加一個會怎么樣?受不了這鳥氣,只能鋌而走險(結果可以,下次就可以直接在下載目錄下修改,不用copy)。


社會人就要建一個project.bat,多一步都受不了:
f:ncd /d f:Goprojectnset GO111MODULE=autoncmd
set GO111MODULE=auto
Excelize 是 Go 語言編寫的用于操作 Office Excel 文檔基礎庫
介紹 · Excelize 簡體字文檔go無法讀取xlsb文件。真是蝦掉了。
func (f *File) GetSheetName(index int) stringnvisible, err := f.GetColVisible("Sheet1", "D")nerr := f.GetRowVisible("Sheet1", 2)nnf, err := excelize.OpenFile("./Book1.xlsx")nif err != nil {n returnn}nfor index, name := range f.GetSheetMap() {n fmt.Println(index, name)n}
func (f *File) GetSheetList() []string
這個excel的處理庫還是非常初級的。沒有讀取range的功能,沒有直接把excel表轉換成內部數組、字典、切片等的工具。
Golang 發展到現在是否有類似 Python 那樣數據分析和爬蟲包呢?
for-range時拷貝了被訪問的列表(array、slice、hashmap等)。
當數組比較大時,for-range拷貝數組的開銷也會比較大,在實際應用中應當避免這個開銷。(這個值得商榷,有修改的時候copy正常,只是讀取copy的毛啊。數組的增刪操作底層都是通過copy來實現,這個沒有毛病。不用copy難道用鏈表嗎。)
為什么很少人用golang做大數據分析?
喵的,要是golang能有幾個numpy、pandas級別的利器,誰還用python
世界非常現實:
因為蘋果看中了這一塊市場,想把python給擠出去,于是聯合了谷歌和tensorflow的作者們,決定把swift推上科學計算和DL的首席語言的寶座……谷歌和蘋果達成了這種同盟關系,因為要忠于該同盟,所以抑制了golang的發展,似乎不允許golang染指科學計算領域,所以谷歌里搞golang的那幫人只滿足于在web上的成功,而不考慮科學計算領域……
沒有人會告訴你的真相:
golang有它擅長的地方,也具備某些潛質。但目前而言,如果用于分析計算,哪怕是中等規模的運算,方便程度恐怕比excel還要差一些。
浮點數的工業精度和運算精度問題,日期的特殊格式問題,空值處理問題等等等等,這些都是困擾好多新手甚至高手的問題。
珍愛生命,科學計算請暫時遠離golang,當然一般程序運算還是沒問題的。
Go用來做數據科學---goplus_shelgi的博客-CSDN博客_goplus
再敘,多維數組。
沒有必要死磕C有沒有多維數組,多開幾個一位數組不就解決了嗎。要長得好看,就用語法糖給數組整整容。大道至簡,不為世俗幻象所惑。
286.vscode有bug,vscode go的查包路徑在GOPATH上不正確。導致命令行運行沒問題,而代碼源文件一直報錯。太欺負人了。

F:Goproject>go envnset GO111MODULE=onnset GOARCH=amd64nset GOBIN=nset GOCACHE=C:UsersAdministrator.SKY-20190322NSLAppDataLocalgo-buildnset GOENV=C:UsersAdministrator.SKY-20190322NSLAppDataRoaminggoenvnset GOEXE=.exenset GOFLAGS=nset GOHOSTARCH=amd64nset GOHOSTOS=windowsnset GOINSECURE=nset GOMODCACHE=f:gobinpkgmodnset GONOPROXY=*.gitlab.com,*.gitee.comnset GONOSUMDB=*.gitlab.com,*.gitee.comnset GOOS=windowsnset GOPATH=f:gobinnset GOPRIVATE=*.gitlab.com,*.gitee.comnset GOPROXY=https://goproxy.cnnset GOROOT=f:gonset GOSUMDB=sum.golang.google.cnnset GOTMPDIR=nset GOTOOLDIR=f:gopkgtoolwindows_amd64nset GOVCS=nset GOVERSION=go1.16.6nset GCCGO=gccgonset AR=arnset CC=gccnset CXX=g++nset CGO_ENABLED=1nset GOMOD=NULnset CGO_CFLAGS=-g -O2nset CGO_CPPFLAGS=nset CGO_CXXFLAGS=-g -O2nset CGO_FFLAGS=-g -O2nset CGO_LDFLAGS=-g -O2nset PKG_CONFIG=pkg-confignset GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:UsersADMINI~1.SKYAppDataLocalTempgo-build1281800375=/tmp/go-build -gno-record-gcc-switches
287.了解了Go的老底以后,決定還是先用python寫一遍,看看效果。效果不行再用Go或者直接上C。python的[for in if ]騷操作太迷人。
288.合同、開票、收款管理
這個猛將,四個引號才能代表一個引號
="""" & A2 & """"
excel如何將字符串轉換成公式?
這竟然成了一個問題。indirect不行,evalute沒這函數。
單元格-選擇性粘貼-數值。可以實現,但是讓一個不懂的這么去操作,肯定是找麻煩的。她會這么去操作就不需要你去這么教她了。
EVALUATE函數是office2013上的函數,office2007要么自己搞。
在wps中解決了。有evaluate
excel的動態公式:
=EVALUATE("=VLOOKUP("&""""&"*合同金額*"&""""&","&A2&"!A:A,1,0)")
=EVALUATE("=MATCH("&""""&"合計"&""""&","&A2&"!A:A,0)")
是不是到了卸載office2007,改office2016得時候啦?想想那么多的ado連接用的還是ole12,想想還是算了。
上一篇:驕龍九變——從“瓦良格”號重型載機巡洋艦到“遼寧”號航空母艦(4)
下一篇:@2








