2014-06-18 2 views
0

내 프로젝트의 한 가지 특징은 운영자가 입력 한 부품 번호를 데이터베이스의 열에있는 사전 결정된 부품 번호 목록과 비교하는 것입니다. 지금 당장, 스프레드 시트 (50+)에 입력 된 모든 부품 번호가 데이터베이스에있는 부품 번호와 일치하지 않는다는 내용의 프로그램이 나에게 잘못된 것으로 확인되었습니다. 스프레드 시트 부품 번호와 데이터베이스 부품 번호가 모두 문자열 데이터 유형인지 확인했습니다. 나는 루프 논리가 좋다는 것을 이중 검사했고, 나에게 그것이 효과가있는 것처럼 보인다. 내가 아는 한 데이터베이스 셀이나 스프레드 시트 셀에는 숨겨진 문자가 없습니다. 내 프로그램이 스프레드 시트와 데이터베이스 간의 일치를 감지하지 못하는 이유에 관해서는이 시점에서 완전히 혼란 스럽다. 보조 노트에스프레드 시트 항목이 데이터베이스 열 항목과 일치하는지 확인

Sub CheckPN() 
    'Connect to the E2 database 
    Call SetPNConnection 
    'Open a recordset 
    Set PNRecordset = New ADODB.Recordset 
    PNRecordset.Open "EstimRpt", PNConnection, adOpenKeyset, adLockOptimistic, adCmdTable 
    PNSQLCmd = "SELECT DISTINCT [PartNo] FROM EstimRpt;" 
    'Loop through data, comparing part numbers to E2 database part number records 
    TotalBadPNCount = 0 
    With PNRecordset 
     For DataRowCount = 2 To TrackingLastRow 
     PNCount = 0 
     Part_Number = Tracking.Sheets("Operator Data").Range("A" & DataRowCount).Value 
     'MsgBox "The datatype for " & Part_Number & " is " & VarType(Part_Number) & "." 
     Do Until .EOF 
      'MsgBox "The datatype for " & .Fields("PartNo").Value & " is " & VarType(.Fields("PartNo").Value) & "." 
      If Part_Number = .Fields("PartNo").Value Then 
      'If .Fields("PartNo").Value = Part_Number Then 
       MsgBox Part_Number & " is a match." 
       PNCount = PNCount + 1 
      End If 
      .MoveNext 
     Loop 
     If PNCount < 1 Then 
      MsgBox "The P/N " & Part_Number & " entered in cell A" & DataRowCount & " is incorrect. Please correctly enter the P/N and re-run the program." 
      TotalBadPNCount = TotalBadPNCount + 1 
     End If 
     Next DataRowCount 
     If TotalBadPNCount >= 1 Then 
     Exit Sub 
     End If 
    End With 
    PNRecordset.Close 
    Set PNRecordset = Nothing 
    PNConnection.Close 
    Set PNConnection = Nothing 
End Sub 

, 나는 부품 번호뿐 아니라 일치하지 않는 경우 전체 프로그램 정지가 실행이 싶습니다 다음은 부품 번호가 일치가 있음을 확인하기위한 코드를 포함하는 서브는 즉시 하위. 현재이 하위는 부품 번호가 일치하지 않을 때 종료됩니다.

두 가지 문제에 도움을 주셔서 감사합니다.

요르단

답변

0

나는 영구 테이블에 사용자가 제출 한 데이터 세트에서 레코드를 비교하는 루프를 사용하지 않는 게 좋을 것. 대신 사용자 제출 데이터 세트를 DB의 임시 테이블에로드하고 SQL을 사용하여 2 개의 테이블을 비교하십시오.

당신은이 라인을 따라 뭔가를 시도 할 수 있습니다 :

'Load spreadsheet into temp table 
<your code here> 

'open recordset in order to compare PartNos 
Dim db As Database 
Set db = CurrentDb 
Dim rs As Recordset 

sSQL = "select count(*) as [count] from temp " _ 
     & " where temp.PartNo not in (select distinct EstimRpt.PartNo from EstimRpt)" 
Set rs = db.OpenRecordset(sSQL) 

ctRecords = rs![Count] 

'if records are found in temp table that do not exist 
'in the perm table, then end execution of everything. 
if ctRecords > 0 then 
    End 
else 
    'run the rest of your code 
    <your code here> 
end if 

'Drop temp table 
<your code here> 
+0

내 사용자가 제출 한 Excel 데이터 집합의 레코드를 영구적 인 Access 테이블과 비교하는 것이 특별한 이유가 있습니까? 이 경로를 사용하는 대신에 비교적 성가신 것으로 보인다. Access와 Excel 레코드가 모두 string 유형 인 경우 일치해야하는 항목이 일치하지 않는 이유는 무엇입니까? 두 레코드 사이에 "숨겨진"차이가 있습니까? 당신의 도움을 주셔서 감사합니다. – jlynn303

+0

파일에 액세스하지 않고도 현재 비교가 작동하지 않는 이유를 알 수 없습니다. Excel/Access 버전간에 호환성 문제가있는 경우 비교를 실행하기 전에 Excel 데이터를 Access로 가져 와서 Access에 가져온 Excel 열의 데이터 형식을 확인합니다. 데이터가 Access에 있으면 [RBAR] (https://www.simple-talk.com/sql/t-sql-programming/rbar--row-by-agonizing-model-training)을 사용하지 않고도 설정 기반 비교를 실행할 수 있습니다. 행 /)을 사용하면 대용량 데이터 세트를 처리 할 때 성능이 크게 향상됩니다. –

+0

필자가 읽는 데이터베이스는 어떤 방식 으로든 변경/변경/수정하지 말아야하는 필수 데이터베이스입니다 (상점 관리 프로그램에 사용되는 대규모 데이터베이스). 따라서, 나는 단지 그것으로부터 데이터를 읽기만하고 다른 것은 읽지 않기를 원한다.그래서, 저것을 제외하고, 나는 다시 두 값이 문자열임을 확인하고, Excel 프로그램의 메시지 상자에 따르면, Excel 프로그램은 Excel에서 쓰여지는대로 정확하게 데이터베이스 값을 읽고 해석하고 있습니다. 이것은 내 데이터가 좋음을 나타내지 만 루핑에는 결함이 있지만 잘 보입니다. 개미 제안? – jlynn303

0

나는 내 문제에서 오래 발견했다. 데이터베이스와 스프레드 시트 간의 레코드를 비교하면 현재 작동합니다. 대신

:

Do Until .EOF 

내가 필요 : 나는 또한 단지 For 루프 선언 한 후 다음을 추가하는 데 필요한

Do Until .EOF = True 

:

내 코드를 다음과 같이 변경했습니다
.MoveFirst 

이제 내 코드가 올바르게 반복됩니다.

관련 문제