Add printer QR code printing and Windows name auto-update
- Add printerqrcode.asp for single printer QR code labels (ULINE S-20135) - Add printerqrbatch.asp for batch printing multiple printers (6 per page) - Add auto-update of Windows name when changing associated machine - Windows name follows naming standard: [CSF]-[Machine]-[Vendor][Model] - Remove UDC integrations from displaymachine.asp - Add toner_inventory.csv for HP printer toner tracking - Fix printerqrbatch.asp to show all printers, not just CSF ones 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -113,23 +113,6 @@
|
|||||||
Response.End
|
Response.End
|
||||||
End If
|
End If
|
||||||
|
|
||||||
' Check if machine has UDC data (only for equipment with machinenumber)
|
|
||||||
Dim rsUDCCheck, hasUDCData, strSQL2, machineNum
|
|
||||||
hasUDCData = False
|
|
||||||
machineNum = rs("machinenumber") & ""
|
|
||||||
If machineNum <> "" Then
|
|
||||||
strSQL2 = "SELECT COUNT(*) as cnt FROM udcparts p " & _
|
|
||||||
"JOIN udcsessions s ON p.sessionid = s.sessionid " & _
|
|
||||||
"WHERE s.machinenumber = ?"
|
|
||||||
Set rsUDCCheck = ExecuteParameterizedQuery(objConn, strSQL2, Array(machineNum))
|
|
||||||
If Not rsUDCCheck Is Nothing Then
|
|
||||||
If Not rsUDCCheck.EOF Then
|
|
||||||
If CLng(rsUDCCheck("cnt") & "0") > 0 Then hasUDCData = True
|
|
||||||
End If
|
|
||||||
rsUDCCheck.Close
|
|
||||||
Set rsUDCCheck = Nothing
|
|
||||||
End If
|
|
||||||
End If
|
|
||||||
%>
|
%>
|
||||||
|
|
||||||
<body class="bg-theme <%=Server.HTMLEncode(theme)%>">
|
<body class="bg-theme <%=Server.HTMLEncode(theme)%>">
|
||||||
@@ -192,11 +175,6 @@
|
|||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="javascript:void();" data-target="#applications" data-toggle="pill" class="nav-link"><i class="zmdi zmdi-apps"></i> <span class="hidden-xs">Applications</span></a>
|
<a href="javascript:void();" data-target="#applications" data-toggle="pill" class="nav-link"><i class="zmdi zmdi-apps"></i> <span class="hidden-xs">Applications</span></a>
|
||||||
</li>
|
</li>
|
||||||
<% End If %>
|
|
||||||
<% If hasUDCData Then %>
|
|
||||||
<li class="nav-item">
|
|
||||||
<a href="javascript:void();" data-target="#udc" data-toggle="pill" class="nav-link"><i class="zmdi zmdi-chart"></i> <span class="hidden-xs">UDC</span></a>
|
|
||||||
</li>
|
|
||||||
<% End If %>
|
<% End If %>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="./machineedit.asp?machineid=<%=Server.HTMLEncode(machineid)%>" class="nav-link" style="background: linear-gradient(45deg, #667eea 0%, #764ba2 100%); color: white;"><i class="zmdi zmdi-edit"></i> <span class="hidden-xs">Edit Machine</span></a>
|
<a href="./machineedit.asp?machineid=<%=Server.HTMLEncode(machineid)%>" class="nav-link" style="background: linear-gradient(45deg, #667eea 0%, #764ba2 100%); color: white;"><i class="zmdi zmdi-edit"></i> <span class="hidden-xs">Edit Machine</span></a>
|
||||||
@@ -819,338 +797,6 @@ End If
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<% End If %>
|
|
||||||
<% If hasUDCData Then %>
|
|
||||||
<div class="tab-pane" id="udc">
|
|
||||||
<h5 class="mb-3">UDC Performance Data</h5>
|
|
||||||
|
|
||||||
<!-- Today's Stats Summary Cards -->
|
|
||||||
<div class="row mb-4">
|
|
||||||
<%
|
|
||||||
' Get today's UDC stats for this machine
|
|
||||||
Dim rsUDCToday, todayParts, todayOOT, todayAvgCycle, todayLastBadge
|
|
||||||
strSQL2 = "SELECT COUNT(*) as partstoday, " & _
|
|
||||||
"SUM(ootcount) as oottoday, " & _
|
|
||||||
"AVG(cycletime) as avgcycle, " & _
|
|
||||||
"(SELECT badgenumber FROM udcparts p2 JOIN udcsessions s2 ON p2.sessionid = s2.sessionid " & _
|
|
||||||
" WHERE s2.machinenumber = ? ORDER BY p2.programend DESC LIMIT 1) as lastbadge " & _
|
|
||||||
"FROM udcparts p " & _
|
|
||||||
"JOIN udcsessions s ON p.sessionid = s.sessionid " & _
|
|
||||||
"WHERE s.machinenumber = ? AND DATE(p.programstart) = CURDATE()"
|
|
||||||
Set rsUDCToday = ExecuteParameterizedQuery(objConn, strSQL2, Array(rs("machinenumber") & "", rs("machinenumber") & ""))
|
|
||||||
If Not rsUDCToday.EOF Then
|
|
||||||
todayParts = CLng(rsUDCToday("partstoday") & "0")
|
|
||||||
todayOOT = CLng(rsUDCToday("oottoday") & "0")
|
|
||||||
If Not IsNull(rsUDCToday("avgcycle")) Then
|
|
||||||
todayAvgCycle = FormatNumber(CDbl(rsUDCToday("avgcycle")) / 60, 1)
|
|
||||||
Else
|
|
||||||
todayAvgCycle = "0"
|
|
||||||
End If
|
|
||||||
todayLastBadge = rsUDCToday("lastbadge") & ""
|
|
||||||
Else
|
|
||||||
todayParts = 0
|
|
||||||
todayOOT = 0
|
|
||||||
todayAvgCycle = "0"
|
|
||||||
todayLastBadge = ""
|
|
||||||
End If
|
|
||||||
rsUDCToday.Close
|
|
||||||
Set rsUDCToday = Nothing
|
|
||||||
%>
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div class="card bg-success text-white">
|
|
||||||
<div class="card-body text-center">
|
|
||||||
<h3 class="mb-0"><%=todayParts%></h3>
|
|
||||||
<small>Parts Today</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div class="card bg-info text-white">
|
|
||||||
<div class="card-body text-center">
|
|
||||||
<h3 class="mb-0"><%=todayAvgCycle%>m</h3>
|
|
||||||
<small>Avg Cycle Time</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div class="card <% If todayOOT > 0 Then Response.Write("bg-danger") Else Response.Write("bg-secondary") End If %> text-white">
|
|
||||||
<div class="card-body text-center">
|
|
||||||
<h3 class="mb-0"><%=todayOOT%></h3>
|
|
||||||
<small>OOT Today</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div class="card bg-primary text-white">
|
|
||||||
<div class="card-body text-center">
|
|
||||||
<h3 class="mb-0"><%If todayLastBadge <> "" Then Response.Write(Server.HTMLEncode(todayLastBadge)) Else Response.Write("-")%></h3>
|
|
||||||
<small>Current Operator</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Recent Activity Log -->
|
|
||||||
<h6 class="mb-2"><i class="zmdi zmdi-time-restore"></i> Recent Activity</h6>
|
|
||||||
<div class="table-responsive mb-4">
|
|
||||||
<table class="table table-hover table-striped table-sm">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Time</th>
|
|
||||||
<th>Type</th>
|
|
||||||
<th>Badge</th>
|
|
||||||
<th>Details</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<%
|
|
||||||
' Get recent activity (violations + badge changes) for this machine
|
|
||||||
Dim rsActivity, actBadge
|
|
||||||
strSQL2 = "SELECT * FROM (" & _
|
|
||||||
"SELECT eventtime, 'Violation' as acttype, badgenumber, " & _
|
|
||||||
"CONCAT(crossingdesc, ': ', previousval, ' -> ', currentval) as details " & _
|
|
||||||
"FROM udcviolations WHERE machinenumber = ? " & _
|
|
||||||
"UNION ALL " & _
|
|
||||||
"SELECT eventtime, 'Badge Change' as acttype, badgenumber, details " & _
|
|
||||||
"FROM udcheaderupdates WHERE machinenumber = ? " & _
|
|
||||||
") combined ORDER BY eventtime DESC LIMIT 15"
|
|
||||||
Set rsActivity = ExecuteParameterizedQuery(objConn, strSQL2, Array(rs("machinenumber") & "", rs("machinenumber") & ""))
|
|
||||||
If rsActivity.EOF Then
|
|
||||||
Response.Write("<tr><td colspan='4' class='text-muted text-center'>No recent activity</td></tr>")
|
|
||||||
Else
|
|
||||||
Do While Not rsActivity.EOF
|
|
||||||
If rsActivity("acttype") = "Violation" Then
|
|
||||||
actBadge = "<span class='badge badge-light'>Setting Change</span>"
|
|
||||||
Else
|
|
||||||
actBadge = "<span class='badge badge-info'>Badge</span>"
|
|
||||||
End If
|
|
||||||
|
|
||||||
Response.Write("<tr>")
|
|
||||||
Response.Write("<td class='small'>" & Server.HTMLEncode(rsActivity("eventtime") & "") & "</td>")
|
|
||||||
Response.Write("<td>" & actBadge & "</td>")
|
|
||||||
Response.Write("<td>" & Server.HTMLEncode(rsActivity("badgenumber") & "") & "</td>")
|
|
||||||
Response.Write("<td class='small'>" & Server.HTMLEncode(rsActivity("details") & "") & "</td>")
|
|
||||||
Response.Write("</tr>")
|
|
||||||
rsActivity.MoveNext
|
|
||||||
Loop
|
|
||||||
End If
|
|
||||||
rsActivity.Close
|
|
||||||
Set rsActivity = Nothing
|
|
||||||
%>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Tool Health Section -->
|
|
||||||
<h6 class="mb-2 mt-4"><i class="zmdi zmdi-settings"></i> Tool Health</h6>
|
|
||||||
<%
|
|
||||||
' Get tool health summary for this machine (last 30 days)
|
|
||||||
Dim rsToolSummary, toolCount, toolMeasurements, toolOOT, toolLastCheck
|
|
||||||
strSQL2 = "SELECT COUNT(DISTINCT t.toolnumber) as unique_tools, " & _
|
|
||||||
"COUNT(*) as total_measurements, " & _
|
|
||||||
"SUM(t.oot) as oot_count, " & _
|
|
||||||
"MAX(t.eventtime) as last_check " & _
|
|
||||||
"FROM udctooldata t " & _
|
|
||||||
"JOIN udcsessions s ON t.sessionid = s.sessionid " & _
|
|
||||||
"WHERE s.machinenumber = ? AND t.eventtime >= DATE_SUB(NOW(), INTERVAL 30 DAY)"
|
|
||||||
Set rsToolSummary = ExecuteParameterizedQuery(objConn, strSQL2, Array(rs("machinenumber") & ""))
|
|
||||||
If Not rsToolSummary.EOF Then
|
|
||||||
toolCount = CLng(rsToolSummary("unique_tools") & "0")
|
|
||||||
toolMeasurements = CLng(rsToolSummary("total_measurements") & "0")
|
|
||||||
toolOOT = CLng(rsToolSummary("oot_count") & "0")
|
|
||||||
toolLastCheck = rsToolSummary("last_check") & ""
|
|
||||||
Else
|
|
||||||
toolCount = 0
|
|
||||||
toolMeasurements = 0
|
|
||||||
toolOOT = 0
|
|
||||||
toolLastCheck = ""
|
|
||||||
End If
|
|
||||||
rsToolSummary.Close
|
|
||||||
Set rsToolSummary = Nothing
|
|
||||||
|
|
||||||
If toolMeasurements > 0 Then
|
|
||||||
%>
|
|
||||||
<!-- Tool Health Summary Cards -->
|
|
||||||
<div class="row mb-3">
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div class="card bg-secondary text-white">
|
|
||||||
<div class="card-body text-center py-2">
|
|
||||||
<h4 class="mb-0"><%=toolCount%></h4>
|
|
||||||
<small>Tools Monitored</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div class="card bg-info text-white">
|
|
||||||
<div class="card-body text-center py-2">
|
|
||||||
<h4 class="mb-0"><%=toolMeasurements%></h4>
|
|
||||||
<small>Measurements (30d)</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div class="card <% If toolOOT > 0 Then Response.Write("bg-danger") Else Response.Write("bg-success") End If %> text-white">
|
|
||||||
<div class="card-body text-center py-2">
|
|
||||||
<h4 class="mb-0"><%=toolOOT%></h4>
|
|
||||||
<small>Out of Tolerance</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-3">
|
|
||||||
<div class="card bg-primary text-white">
|
|
||||||
<div class="card-body text-center py-2">
|
|
||||||
<h6 class="mb-0"><%If toolLastCheck <> "" Then Response.Write(Server.HTMLEncode(Left(toolLastCheck, 16))) Else Response.Write("-")%></h6>
|
|
||||||
<small>Last Tool Check</small>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Tool Status Table -->
|
|
||||||
<div class="table-responsive mb-3">
|
|
||||||
<table class="table table-hover table-striped table-sm">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Tool #</th>
|
|
||||||
<th>Description</th>
|
|
||||||
<th>Checks</th>
|
|
||||||
<th>Avg Dev</th>
|
|
||||||
<th>Max Dev</th>
|
|
||||||
<th>Status</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<%
|
|
||||||
' Get tool status by tool number
|
|
||||||
Dim rsTools, toolStatus, toolStatusClass, toolAvgDev, toolMaxDev, toolDevPct
|
|
||||||
strSQL2 = "SELECT t.toolnumber, " & _
|
|
||||||
"MAX(t.description) as description, " & _
|
|
||||||
"COUNT(*) as measurements, " & _
|
|
||||||
"ROUND(AVG(t.deviation), 4) as avg_deviation, " & _
|
|
||||||
"ROUND(MAX(ABS(t.deviation)), 4) as max_deviation, " & _
|
|
||||||
"MAX(ABS(t.minval)) as tolerance_ref, " & _
|
|
||||||
"SUM(t.oot) as oot_count " & _
|
|
||||||
"FROM udctooldata t " & _
|
|
||||||
"JOIN udcsessions s ON t.sessionid = s.sessionid " & _
|
|
||||||
"WHERE s.machinenumber = ? AND t.eventtime >= DATE_SUB(NOW(), INTERVAL 30 DAY) " & _
|
|
||||||
"GROUP BY t.toolnumber " & _
|
|
||||||
"ORDER BY oot_count DESC, measurements DESC " & _
|
|
||||||
"LIMIT 10"
|
|
||||||
Set rsTools = ExecuteParameterizedQuery(objConn, strSQL2, Array(rs("machinenumber") & ""))
|
|
||||||
If rsTools.EOF Then
|
|
||||||
Response.Write("<tr><td colspan='6' class='text-muted text-center'>No tool data available</td></tr>")
|
|
||||||
Else
|
|
||||||
Do While Not rsTools.EOF
|
|
||||||
' Calculate status based on OOT and deviation
|
|
||||||
If CLng(rsTools("oot_count") & "0") > 0 Then
|
|
||||||
toolStatus = "<i class='zmdi zmdi-alert-circle'></i> <strong>OOT</strong>"
|
|
||||||
toolStatusClass = "bg-danger text-white"
|
|
||||||
Else
|
|
||||||
toolStatus = "<i class='zmdi zmdi-check-circle text-success'></i> OK"
|
|
||||||
toolStatusClass = ""
|
|
||||||
End If
|
|
||||||
|
|
||||||
If Not IsNull(rsTools("avg_deviation")) Then
|
|
||||||
toolAvgDev = FormatNumber(CDbl(rsTools("avg_deviation")), 4)
|
|
||||||
Else
|
|
||||||
toolAvgDev = "-"
|
|
||||||
End If
|
|
||||||
If Not IsNull(rsTools("max_deviation")) Then
|
|
||||||
toolMaxDev = FormatNumber(CDbl(rsTools("max_deviation")), 4)
|
|
||||||
Else
|
|
||||||
toolMaxDev = "-"
|
|
||||||
End If
|
|
||||||
|
|
||||||
Response.Write("<tr class='" & toolStatusClass & "'>")
|
|
||||||
Response.Write("<td><strong>" & Server.HTMLEncode(rsTools("toolnumber") & "") & "</strong></td>")
|
|
||||||
Response.Write("<td class='small'>" & Server.HTMLEncode(Left(rsTools("description") & "", 30)) & "</td>")
|
|
||||||
Response.Write("<td>" & rsTools("measurements") & "</td>")
|
|
||||||
Response.Write("<td>" & toolAvgDev & "</td>")
|
|
||||||
Response.Write("<td>" & toolMaxDev & "</td>")
|
|
||||||
Response.Write("<td>" & toolStatus & "</td>")
|
|
||||||
Response.Write("</tr>")
|
|
||||||
rsTools.MoveNext
|
|
||||||
Loop
|
|
||||||
End If
|
|
||||||
rsTools.Close
|
|
||||||
Set rsTools = Nothing
|
|
||||||
%>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<%
|
|
||||||
' Check for recent OOT events
|
|
||||||
Dim rsOOT, ootEventCount
|
|
||||||
strSQL2 = "SELECT COUNT(*) as cnt FROM udctooldata t " & _
|
|
||||||
"JOIN udcsessions s ON t.sessionid = s.sessionid " & _
|
|
||||||
"WHERE s.machinenumber = ? AND t.oot = 1 AND t.eventtime >= DATE_SUB(NOW(), INTERVAL 7 DAY)"
|
|
||||||
Set rsOOT = ExecuteParameterizedQuery(objConn, strSQL2, Array(rs("machinenumber") & ""))
|
|
||||||
ootEventCount = 0
|
|
||||||
If Not rsOOT.EOF Then ootEventCount = CLng(rsOOT("cnt") & "0")
|
|
||||||
rsOOT.Close
|
|
||||||
Set rsOOT = Nothing
|
|
||||||
|
|
||||||
If ootEventCount > 0 Then
|
|
||||||
%>
|
|
||||||
<!-- Recent OOT Events -->
|
|
||||||
<h6 class="mb-2"><i class="zmdi zmdi-alert-triangle text-warning"></i> Recent Out-of-Tolerance Events (7 days)</h6>
|
|
||||||
<div class="table-responsive mb-3">
|
|
||||||
<table class="table table-hover table-sm">
|
|
||||||
<thead class="thead-light">
|
|
||||||
<tr>
|
|
||||||
<th>Time</th>
|
|
||||||
<th>Tool #</th>
|
|
||||||
<th>Description</th>
|
|
||||||
<th>Actual</th>
|
|
||||||
<th>Min/Max</th>
|
|
||||||
<th>Deviation</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<%
|
|
||||||
Dim rsOOTEvents
|
|
||||||
strSQL2 = "SELECT t.eventtime, t.toolnumber, t.description, " & _
|
|
||||||
"t.actualval, t.minval, t.maxval, t.deviation " & _
|
|
||||||
"FROM udctooldata t " & _
|
|
||||||
"JOIN udcsessions s ON t.sessionid = s.sessionid " & _
|
|
||||||
"WHERE s.machinenumber = ? AND t.oot = 1 AND t.eventtime >= DATE_SUB(NOW(), INTERVAL 7 DAY) " & _
|
|
||||||
"ORDER BY t.eventtime DESC LIMIT 10"
|
|
||||||
Set rsOOTEvents = ExecuteParameterizedQuery(objConn, strSQL2, Array(rs("machinenumber") & ""))
|
|
||||||
Do While Not rsOOTEvents.EOF
|
|
||||||
Response.Write("<tr class='bg-warning'>")
|
|
||||||
Response.Write("<td class='small'>" & Server.HTMLEncode(rsOOTEvents("eventtime") & "") & "</td>")
|
|
||||||
Response.Write("<td><strong>" & Server.HTMLEncode(rsOOTEvents("toolnumber") & "") & "</strong></td>")
|
|
||||||
Response.Write("<td class='small'>" & Server.HTMLEncode(Left(rsOOTEvents("description") & "", 25)) & "</td>")
|
|
||||||
Response.Write("<td>" & FormatNumber(CDbl(rsOOTEvents("actualval") & "0"), 4) & "</td>")
|
|
||||||
Response.Write("<td class='small'>" & FormatNumber(CDbl(rsOOTEvents("minval") & "0"), 4) & " / " & FormatNumber(CDbl(rsOOTEvents("maxval") & "0"), 4) & "</td>")
|
|
||||||
Response.Write("<td class='text-danger'><strong>" & FormatNumber(CDbl(rsOOTEvents("deviation") & "0"), 4) & "</strong></td>")
|
|
||||||
Response.Write("</tr>")
|
|
||||||
rsOOTEvents.MoveNext
|
|
||||||
Loop
|
|
||||||
rsOOTEvents.Close
|
|
||||||
Set rsOOTEvents = Nothing
|
|
||||||
%>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<%
|
|
||||||
End If ' ootEventCount > 0
|
|
||||||
Else ' toolMeasurements = 0
|
|
||||||
%>
|
|
||||||
<div class="alert alert-secondary">
|
|
||||||
<i class="zmdi zmdi-info-outline"></i> No tool measurement data available for this machine.
|
|
||||||
</div>
|
|
||||||
<%
|
|
||||||
End If ' toolMeasurements > 0
|
|
||||||
%>
|
|
||||||
|
|
||||||
<!-- Link to Full Dashboard -->
|
|
||||||
<div class="text-center">
|
|
||||||
<a href="./displayudc.asp?machine=<%=Server.URLEncode(rs("machinenumber") & "")%>" class="btn btn-primary">
|
|
||||||
<i class="zmdi zmdi-chart"></i> View Full UDC Dashboard
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<% End If %>
|
<% End If %>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
2641
displayprinter.asp
2641
displayprinter.asp
File diff suppressed because it is too large
Load Diff
284
printerqrbatch.asp
Normal file
284
printerqrbatch.asp
Normal file
@@ -0,0 +1,284 @@
|
|||||||
|
<%@ Language=VBScript %>
|
||||||
|
<%
|
||||||
|
Option Explicit
|
||||||
|
Dim objConn, rs
|
||||||
|
%>
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<!--#include file="./includes/sql.asp"-->
|
||||||
|
<title>Batch Print QR Codes</title>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js"></script>
|
||||||
|
<style>
|
||||||
|
/* ULINE S-20135: 8.5x11 sheet, 3x3 labels, 2 cols x 3 rows */
|
||||||
|
/* Measured: top 0.875in, sides 1.1875in, gaps 0.125in */
|
||||||
|
@page { size: letter; margin: 0; }
|
||||||
|
body { font-family: Arial, sans-serif; background: #f0f0f0; margin: 0; padding: 20px; }
|
||||||
|
|
||||||
|
.no-print { margin-bottom: 20px; }
|
||||||
|
.controls { background: white; padding: 20px; border-radius: 8px; margin-bottom: 20px; }
|
||||||
|
.controls h3 { margin-top: 0; }
|
||||||
|
.print-btn { padding: 10px 30px; font-size: 16px; cursor: pointer; background: #667eea; color: white; border: none; border-radius: 5px; margin-right: 10px; }
|
||||||
|
.print-btn:disabled { background: #ccc; cursor: not-allowed; }
|
||||||
|
.clear-btn { padding: 10px 20px; font-size: 14px; cursor: pointer; background: #dc3545; color: white; border: none; border-radius: 5px; margin-right: 10px; }
|
||||||
|
.select-all-btn { padding: 10px 20px; font-size: 14px; cursor: pointer; background: #28a745; color: white; border: none; border-radius: 5px; }
|
||||||
|
|
||||||
|
.printer-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 10px; max-height: 300px; overflow-y: auto; border: 1px solid #ddd; padding: 10px; background: #fafafa; }
|
||||||
|
.printer-item { display: flex; align-items: center; padding: 8px; background: white; border: 1px solid #ddd; border-radius: 4px; cursor: pointer; }
|
||||||
|
.printer-item:hover { background: #f0f0f0; }
|
||||||
|
.printer-item.selected { background: #e7f1ff; border-color: #667eea; }
|
||||||
|
.printer-item input { margin-right: 10px; }
|
||||||
|
.printer-item label { cursor: pointer; flex: 1; }
|
||||||
|
.printer-item .model { font-size: 11px; color: #666; }
|
||||||
|
|
||||||
|
.selected-count { font-weight: bold; margin: 10px 0; }
|
||||||
|
.selected-count .count { color: #667eea; }
|
||||||
|
.selected-count .pages { color: #28a745; }
|
||||||
|
|
||||||
|
.sheets-container { display: flex; flex-direction: column; gap: 20px; }
|
||||||
|
|
||||||
|
.print-sheet { width: 8.5in; height: 11in; background: white; margin: 0 auto; position: relative; border: 1px solid #ccc; page-break-after: always; }
|
||||||
|
.print-sheet:last-child { page-break-after: auto; }
|
||||||
|
|
||||||
|
.sheet-label { position: absolute; top: -25px; left: 0; font-size: 12px; color: #666; }
|
||||||
|
|
||||||
|
.label {
|
||||||
|
width: 3in;
|
||||||
|
height: 3in;
|
||||||
|
position: absolute;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 0.1in;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 1px dashed #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.label.filled { border: 2px solid #667eea; }
|
||||||
|
.label.empty { background: #fafafa; }
|
||||||
|
|
||||||
|
/* Label positions - top: 0.875in, left: 1.1875in, gap: 0.125in */
|
||||||
|
.pos-1 { top: 0.875in; left: 1.1875in; }
|
||||||
|
.pos-2 { top: 0.875in; left: 4.3125in; }
|
||||||
|
.pos-3 { top: 4in; left: 1.1875in; }
|
||||||
|
.pos-4 { top: 4in; left: 4.3125in; }
|
||||||
|
.pos-5 { top: 7.125in; left: 1.1875in; }
|
||||||
|
.pos-6 { top: 7.125in; left: 4.3125in; }
|
||||||
|
|
||||||
|
.model-name { font-size: 11pt; font-weight: bold; text-align: center; margin-bottom: 0.1in; color: #000; }
|
||||||
|
.qr-container { text-align: center; }
|
||||||
|
.info-section { margin-top: 0.1in; display: flex; flex-direction: column; align-items: center; }
|
||||||
|
.info-inner { text-align: left; }
|
||||||
|
.info-row { font-size: 9pt; color: #333; margin: 1px 0; white-space: nowrap; }
|
||||||
|
.csf-name { font-size: 12pt; font-weight: bold; font-family: monospace; text-align: center; margin-bottom: 2px; }
|
||||||
|
|
||||||
|
.empty-label { color: #999; font-size: 14px; }
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
body { padding: 0; margin: 0; background: white; }
|
||||||
|
.no-print { display: none; }
|
||||||
|
.sheets-container { gap: 0; }
|
||||||
|
.print-sheet { border: none; margin: 0; width: 8.5in; height: 11in; overflow: hidden; }
|
||||||
|
.sheet-label { display: none; }
|
||||||
|
.label { border: none !important; }
|
||||||
|
.label.empty { visibility: hidden; }
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<%
|
||||||
|
Dim strSQL
|
||||||
|
strSQL = "SELECT p.printerid, p.printercsfname, p.printerwindowsname, p.ipaddress, m.modelnumber " & _
|
||||||
|
"FROM printers p LEFT JOIN models m ON p.modelid = m.modelnumberid " & _
|
||||||
|
"WHERE p.isactive = 1 " & _
|
||||||
|
"ORDER BY COALESCE(NULLIF(p.printercsfname, ''), p.printerwindowsname, CONCAT('Printer-', p.printerid))"
|
||||||
|
Set rs = objConn.Execute(strSQL)
|
||||||
|
%>
|
||||||
|
<div class="no-print">
|
||||||
|
<div class="controls">
|
||||||
|
<h3>Batch Print Printer QR Codes</h3>
|
||||||
|
<p>Select printers to print (6 per page):</p>
|
||||||
|
|
||||||
|
<div class="printer-grid">
|
||||||
|
<%
|
||||||
|
Dim displayName
|
||||||
|
Do While Not rs.EOF
|
||||||
|
displayName = rs("printercsfname") & ""
|
||||||
|
If displayName = "" Then
|
||||||
|
displayName = rs("printerwindowsname") & ""
|
||||||
|
End If
|
||||||
|
If displayName = "" Then
|
||||||
|
displayName = "Printer-" & rs("printerid")
|
||||||
|
End If
|
||||||
|
%>
|
||||||
|
<div class="printer-item" onclick="togglePrinter(this, <%=rs("printerid")%>, '<%=Server.HTMLEncode(Replace(rs("printercsfname") & "", "'", "\'"))%>', '<%=Server.HTMLEncode(Replace(rs("printerwindowsname") & "", "'", "\'"))%>', '<%=Server.HTMLEncode(Replace(rs("ipaddress") & "", "'", "\'"))%>', '<%=Server.HTMLEncode(Replace(rs("modelnumber") & "", "'", "\'"))%>')">
|
||||||
|
<input type="checkbox" id="printer-<%=rs("printerid")%>">
|
||||||
|
<label>
|
||||||
|
<strong><%=Server.HTMLEncode(displayName)%></strong>
|
||||||
|
<div class="model"><%=Server.HTMLEncode(rs("modelnumber") & "")%></div>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<%
|
||||||
|
rs.MoveNext
|
||||||
|
Loop
|
||||||
|
rs.Close
|
||||||
|
Set rs = Nothing
|
||||||
|
objConn.Close
|
||||||
|
%>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="selected-count">
|
||||||
|
Selected: <span class="count" id="selectedCount">0</span> printers
|
||||||
|
(<span class="pages" id="pageCount">0</span> pages)
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="print-btn" id="printBtn" onclick="window.print()" disabled>Print QR Codes</button>
|
||||||
|
<button class="clear-btn" onclick="clearSelection()">Clear All</button>
|
||||||
|
<button class="select-all-btn" onclick="selectAll()">Select All</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="sheets-container" id="sheetsContainer">
|
||||||
|
<!-- Sheets will be generated dynamically -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var selectedPrinters = [];
|
||||||
|
var allPrinters = [];
|
||||||
|
|
||||||
|
// Store all printer data on load
|
||||||
|
document.querySelectorAll('.printer-item').forEach(function(el) {
|
||||||
|
var onclick = el.getAttribute('onclick');
|
||||||
|
var match = onclick.match(/togglePrinter\(this, (\d+), '([^']*)', '([^']*)', '([^']*)', '([^']*)'\)/);
|
||||||
|
if (match) {
|
||||||
|
allPrinters.push({
|
||||||
|
id: parseInt(match[1]),
|
||||||
|
csf: match[2].replace(/\\'/g, "'"),
|
||||||
|
win: match[3].replace(/\\'/g, "'"),
|
||||||
|
ip: match[4].replace(/\\'/g, "'"),
|
||||||
|
model: match[5].replace(/\\'/g, "'"),
|
||||||
|
element: el
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function togglePrinter(el, id, csf, win, ip, model) {
|
||||||
|
var checkbox = el.querySelector('input[type="checkbox"]');
|
||||||
|
var index = selectedPrinters.findIndex(function(p) { return p.id === id; });
|
||||||
|
|
||||||
|
if (index > -1) {
|
||||||
|
selectedPrinters.splice(index, 1);
|
||||||
|
checkbox.checked = false;
|
||||||
|
el.classList.remove('selected');
|
||||||
|
} else {
|
||||||
|
selectedPrinters.push({ id: id, csf: csf, win: win, ip: ip, model: model });
|
||||||
|
checkbox.checked = true;
|
||||||
|
el.classList.add('selected');
|
||||||
|
}
|
||||||
|
|
||||||
|
updateSheets();
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearSelection() {
|
||||||
|
selectedPrinters = [];
|
||||||
|
document.querySelectorAll('.printer-item').forEach(function(el) {
|
||||||
|
el.classList.remove('selected');
|
||||||
|
el.querySelector('input[type="checkbox"]').checked = false;
|
||||||
|
});
|
||||||
|
updateSheets();
|
||||||
|
}
|
||||||
|
|
||||||
|
function selectAll() {
|
||||||
|
selectedPrinters = [];
|
||||||
|
allPrinters.forEach(function(p) {
|
||||||
|
selectedPrinters.push({ id: p.id, csf: p.csf, win: p.win, ip: p.ip, model: p.model });
|
||||||
|
p.element.classList.add('selected');
|
||||||
|
p.element.querySelector('input[type="checkbox"]').checked = true;
|
||||||
|
});
|
||||||
|
updateSheets();
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateSheets() {
|
||||||
|
var numPrinters = selectedPrinters.length;
|
||||||
|
var numPages = Math.ceil(numPrinters / 6) || 0;
|
||||||
|
|
||||||
|
document.getElementById('selectedCount').textContent = numPrinters;
|
||||||
|
document.getElementById('pageCount').textContent = numPages;
|
||||||
|
document.getElementById('printBtn').disabled = numPrinters === 0;
|
||||||
|
|
||||||
|
var container = document.getElementById('sheetsContainer');
|
||||||
|
container.innerHTML = '';
|
||||||
|
|
||||||
|
if (numPrinters === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var page = 0; page < numPages; page++) {
|
||||||
|
var sheet = document.createElement('div');
|
||||||
|
sheet.className = 'print-sheet';
|
||||||
|
sheet.style.position = 'relative';
|
||||||
|
|
||||||
|
var sheetLabel = document.createElement('div');
|
||||||
|
sheetLabel.className = 'sheet-label';
|
||||||
|
sheetLabel.textContent = 'Page ' + (page + 1) + ' of ' + numPages;
|
||||||
|
sheet.appendChild(sheetLabel);
|
||||||
|
|
||||||
|
for (var pos = 1; pos <= 6; pos++) {
|
||||||
|
var printerIndex = (page * 6) + (pos - 1);
|
||||||
|
var printer = selectedPrinters[printerIndex];
|
||||||
|
|
||||||
|
var label = document.createElement('div');
|
||||||
|
label.className = 'label pos-' + pos + (printer ? ' filled' : ' empty');
|
||||||
|
|
||||||
|
if (printer) {
|
||||||
|
var qrId = 'qr-' + page + '-' + pos;
|
||||||
|
label.innerHTML =
|
||||||
|
'<div class="model-name">' + escapeHtml(printer.model) + '</div>' +
|
||||||
|
'<div class="qr-container"><div id="' + qrId + '"></div></div>' +
|
||||||
|
'<div class="info-section">' +
|
||||||
|
'<div class="csf-name">' + escapeHtml(printer.csf) + '</div>' +
|
||||||
|
'<div class="info-inner">' +
|
||||||
|
(printer.win ? '<div class="info-row">' + escapeHtml(printer.win) + '</div>' : '') +
|
||||||
|
(printer.ip ? '<div class="info-row">' + escapeHtml(printer.ip) + '</div>' : '') +
|
||||||
|
'</div>' +
|
||||||
|
'</div>';
|
||||||
|
} else {
|
||||||
|
label.innerHTML = '<span class="empty-label">Empty</span>';
|
||||||
|
}
|
||||||
|
|
||||||
|
sheet.appendChild(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
container.appendChild(sheet);
|
||||||
|
|
||||||
|
// Generate QR codes for this sheet
|
||||||
|
for (var pos = 1; pos <= 6; pos++) {
|
||||||
|
var printerIndex = (page * 6) + (pos - 1);
|
||||||
|
var printer = selectedPrinters[printerIndex];
|
||||||
|
if (printer) {
|
||||||
|
var qrId = 'qr-' + page + '-' + pos;
|
||||||
|
var qrEl = document.getElementById(qrId);
|
||||||
|
if (qrEl) {
|
||||||
|
var qrUrl = 'https://tsgwp00525.rd.ds.ge.com/shopdb/displayprinter.asp?printerid=' + printer.id;
|
||||||
|
new QRCode(qrEl, {
|
||||||
|
text: qrUrl,
|
||||||
|
width: 144,
|
||||||
|
height: 144,
|
||||||
|
correctLevel: QRCode.CorrectLevel.M
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeHtml(text) {
|
||||||
|
if (!text) return '';
|
||||||
|
var div = document.createElement('div');
|
||||||
|
div.textContent = text;
|
||||||
|
return div.innerHTML;
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
154
printerqrcode.asp
Normal file
154
printerqrcode.asp
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
<%@ Language=VBScript %>
|
||||||
|
|
||||||
|
<%
|
||||||
|
|
||||||
|
Option Explicit
|
||||||
|
|
||||||
|
Dim objConn, rs
|
||||||
|
|
||||||
|
%>
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<!--#include file="./includes/sql.asp"-->
|
||||||
|
|
||||||
|
<title>Print QR Code</title>
|
||||||
|
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/qrcodejs@1.0.0/qrcode.min.js"></script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
|
||||||
|
/* ULINE S-20135: 8.5x11 sheet, 3x3 labels, 2 cols x 3 rows */
|
||||||
|
|
||||||
|
/* Measured: top 0.875in, sides 1.1875in, gaps 0.125in */
|
||||||
|
|
||||||
|
@page { size: letter; margin: 0; }
|
||||||
|
|
||||||
|
body { font-family: Arial, sans-serif; background: #f0f0f0; margin: 0; padding: 20px; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.no-print { margin-bottom: 20px; text-align: center; }
|
||||||
|
|
||||||
|
.print-btn { padding: 10px 30px; font-size: 16px; cursor: pointer; background: #667eea; color: white; border: none; border-radius: 5px; margin: 5px; }
|
||||||
|
|
||||||
|
.position-select { padding: 8px; font-size: 14px; margin-left: 10px; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.print-sheet { width: 8.5in; height: 11in; background: white; margin: 0 auto; position: relative; border: 1px solid #ccc; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.label {
|
||||||
|
|
||||||
|
width: 3in;
|
||||||
|
|
||||||
|
height: 3in;
|
||||||
|
|
||||||
|
position: absolute;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
|
||||||
|
flex-direction: column;
|
||||||
|
|
||||||
|
align-items: center;
|
||||||
|
|
||||||
|
justify-content: center;
|
||||||
|
|
||||||
|
padding: 0.1in;
|
||||||
|
|
||||||
|
box-sizing: border-box;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Label positions - top: 0.875in, left: 1.1875in, gap: 0.125in */
|
||||||
|
|
||||||
|
.pos-1 { top: 0.875in; left: 1.1875in; }
|
||||||
|
|
||||||
|
.pos-2 { top: 0.875in; left: 4.3125in; }
|
||||||
|
|
||||||
|
.pos-3 { top: 4in; left: 1.1875in; }
|
||||||
|
|
||||||
|
.pos-4 { top: 4in; left: 4.3125in; }
|
||||||
|
|
||||||
|
.pos-5 { top: 7.125in; left: 1.1875in; }
|
||||||
|
|
||||||
|
.pos-6 { top: 7.125in; left: 4.3125in; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.label.inactive { border: 1px dashed #ccc; }
|
||||||
|
|
||||||
|
.label.active { border: 2px solid #667eea; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.model-name { font-size: 11pt; font-weight: bold; text-align: center; margin-bottom: 0.1in; color: #000; }
|
||||||
|
|
||||||
|
.qr-container { text-align: center; }
|
||||||
|
|
||||||
|
.info-section { margin-top: 0.1in; display: flex; flex-direction: column; align-items: center; }
|
||||||
|
|
||||||
|
.info-inner { text-align: left; }
|
||||||
|
|
||||||
|
.info-row { font-size: 9pt; color: #333; margin: 1px 0; white-space: nowrap; }
|
||||||
|
|
||||||
|
.csf-name { font-size: 12pt; font-weight: bold; font-family: monospace; text-align: center; margin-bottom: 2px; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@media print {
|
||||||
|
|
||||||
|
body { padding: 0; margin: 0; background: white; }
|
||||||
|
|
||||||
|
.no-print { display: none; }
|
||||||
|
|
||||||
|
.print-sheet { border: none; margin: 0; width: 8.5in; height: 11in; overflow: hidden; }
|
||||||
|
|
||||||
|
.label { border: none !important; }
|
||||||
|
|
||||||
|
.label.inactive { visibility: hidden; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<%
|
||||||
|
|
||||||
|
Dim printerid, strSQL, csfName, winName, ipAddr, modelName
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
printerid = Request.QueryString("printerid")
|
||||||
|
|
||||||
|
If printerid = "" Then printerid = "0"
|
||||||
|
|
||||||
|
If Not IsNumeric(printerid) Then printerid = "0"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
strSQL = "SELECT p.printercsfname, p.printerwindowsname, p.ipaddress, mo.modelnumber FROM printers p LEFT JOIN models mo ON p.modelid = mo.modelnumberid WHERE p.printerid = " & CLng(printerid)
|
||||||
|
|
||||||
|
Set rs = objConn.Execute(strSQL)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
If rs.EOF Then
|
||||||
|
|
||||||
|
csfName = "NOT FOUND"
|
||||||
|
|
||||||
|
winName = ""
|
||||||
|
|
||||||
|
ipAddr = ""
|
||||||
|
|
||||||
49
toner_inventory.csv
Normal file
49
toner_inventory.csv
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
Toner Model,HP Part Number,Color,Quantity,Location,Compatible Printers,Notes
|
||||||
|
HP 42A,Q5942A,Black,0,,LaserJet 4250/4350,Standard yield ~10000 pages
|
||||||
|
HP 42X,Q5942X,Black,0,,LaserJet 4250/4350,High yield ~20000 pages
|
||||||
|
HP 90A,CE390A,Black,0,,LaserJet M601/M602/M603/M4555,Standard yield ~10000 pages
|
||||||
|
HP 90X,CE390X,Black,0,,LaserJet M602/M603/M4555,High yield ~24000 pages
|
||||||
|
HP 37A,CF237A,Black,0,,LaserJet M607/M608/M609/M631/M632/M633,Standard yield ~11000 pages
|
||||||
|
HP 37X,CF237X,Black,0,,LaserJet M607/M608/M609/M631/M632/M633,High yield ~25000 pages
|
||||||
|
HP 148A,W1480A,Black,0,,LaserJet Pro 4001/4002/4003/4004,Standard yield ~2900 pages
|
||||||
|
HP 148X,W1480X,Black,0,,LaserJet Pro 4001/4002/4003/4004,High yield ~9500 pages
|
||||||
|
HP 87A,CF287A,Black,0,,LaserJet M501/M506/M527,Standard yield ~9000 pages
|
||||||
|
HP 87X,CF287X,Black,0,,LaserJet M501/M506/M527,High yield ~18000 pages
|
||||||
|
HP 147A,W1470A,Black,0,,LaserJet M610/M611/M612/M406/M407,Standard yield ~10500 pages
|
||||||
|
HP 147X,W1470X,Black,0,,LaserJet M610/M611/M612/M406/M407,High yield ~25200 pages
|
||||||
|
HP 55A,CE255A,Black,0,,LaserJet P3015/M521/M525,Standard yield ~6000 pages
|
||||||
|
HP 55X,CE255X,Black,0,,LaserJet P3015/M521/M525,High yield ~12500 pages
|
||||||
|
HP 58A,CF258A,Black,0,,LaserJet Pro M404/M428,Standard yield ~3000 pages
|
||||||
|
HP 58X,CF258X,Black,0,,LaserJet Pro M404/M428,High yield ~10000 pages
|
||||||
|
HP 414A,W2020A,Black,0,,Color LaserJet Pro M454/M479,Standard yield ~2400 pages
|
||||||
|
HP 414A,W2021A,Cyan,0,,Color LaserJet Pro M454/M479,Standard yield ~2100 pages
|
||||||
|
HP 414A,W2022A,Yellow,0,,Color LaserJet Pro M454/M479,Standard yield ~2100 pages
|
||||||
|
HP 414A,W2023A,Magenta,0,,Color LaserJet Pro M454/M479,Standard yield ~2100 pages
|
||||||
|
HP 414X,W2020X,Black,0,,Color LaserJet Pro M454/M479,High yield ~7500 pages
|
||||||
|
HP 414X,W2021X,Cyan,0,,Color LaserJet Pro M454/M479,High yield ~6000 pages
|
||||||
|
HP 414X,W2022X,Yellow,0,,Color LaserJet Pro M454/M479,High yield ~6000 pages
|
||||||
|
HP 414X,W2023X,Magenta,0,,Color LaserJet Pro M454/M479,High yield ~6000 pages
|
||||||
|
HP 206A,W2110A,Black,0,,Color LaserJet Pro M254/M255/M282/M283,Standard yield ~1350 pages
|
||||||
|
HP 206A,W2111A,Cyan,0,,Color LaserJet Pro M254/M255/M282/M283,Standard yield ~1250 pages
|
||||||
|
HP 206A,W2112A,Yellow,0,,Color LaserJet Pro M254/M255/M282/M283,Standard yield ~1250 pages
|
||||||
|
HP 206A,W2113A,Magenta,0,,Color LaserJet Pro M254/M255/M282/M283,Standard yield ~1250 pages
|
||||||
|
HP 206X,W2110X,Black,0,,Color LaserJet Pro M254/M255/M282/M283,High yield ~3150 pages
|
||||||
|
HP 206X,W2111X,Cyan,0,,Color LaserJet Pro M254/M255/M282/M283,High yield ~2450 pages
|
||||||
|
HP 206X,W2112X,Yellow,0,,Color LaserJet Pro M254/M255/M282/M283,High yield ~2450 pages
|
||||||
|
HP 206X,W2113X,Magenta,0,,Color LaserJet Pro M254/M255/M282/M283,High yield ~2450 pages
|
||||||
|
HP 201A,CF400A,Black,0,,Color LaserJet Pro M252/M277,Standard yield ~1500 pages
|
||||||
|
HP 201A,CF401A,Cyan,0,,Color LaserJet Pro M252/M277,Standard yield ~1400 pages
|
||||||
|
HP 201A,CF402A,Yellow,0,,Color LaserJet Pro M252/M277,Standard yield ~1400 pages
|
||||||
|
HP 201A,CF403A,Magenta,0,,Color LaserJet Pro M252/M277,Standard yield ~1400 pages
|
||||||
|
HP 201X,CF400X,Black,0,,Color LaserJet Pro M252/M277,High yield ~2800 pages
|
||||||
|
HP 201X,CF401X,Cyan,0,,Color LaserJet Pro M252/M277,High yield ~2300 pages
|
||||||
|
HP 201X,CF402X,Yellow,0,,Color LaserJet Pro M252/M277,High yield ~2300 pages
|
||||||
|
HP 201X,CF403X,Magenta,0,,Color LaserJet Pro M252/M277,High yield ~2300 pages
|
||||||
|
HP 304A,CC530A,Black,0,,Color LaserJet CP2025/CM2320,Standard yield ~3500 pages
|
||||||
|
HP 304A,CC531A,Cyan,0,,Color LaserJet CP2025/CM2320,Standard yield ~2800 pages
|
||||||
|
HP 304A,CC532A,Yellow,0,,Color LaserJet CP2025/CM2320,Standard yield ~2800 pages
|
||||||
|
HP 304A,CC533A,Magenta,0,,Color LaserJet CP2025/CM2320,Standard yield ~2800 pages
|
||||||
|
HP 131A,CF210A,Black,0,,LaserJet Pro 200 M251/M276,Standard yield ~1600 pages
|
||||||
|
HP 131A,CF211A,Cyan,0,,LaserJet Pro 200 M251/M276,Standard yield ~1800 pages
|
||||||
|
HP 131A,CF212A,Yellow,0,,LaserJet Pro 200 M251/M276,Standard yield ~1800 pages
|
||||||
|
HP 131A,CF213A,Magenta,0,,LaserJet Pro 200 M251/M276,Standard yield ~1800 pages
|
||||||
|
Reference in New Issue
Block a user